PHP – If / else,for,foreach,while – 没有花括号?

一些真正想知道但从来没有发现的东西是PHP中的捷径。

我目前正在使用foreach循环编写一个函数,只有一个语句。 我试图省略大括号,因为你可以在if / else控制结构中进行操作。 没有错误。

 foreach($var as $value) $arr[] = $value; 

现在我试图用同样的方法,但是把一个if / else块放在里面。 再次,工作,没有错误。

 foreach($var as $value) if(1 + 1 == 2) { $arr[] = $value; }; 

然后,我想,“为什么这个工作?” 并省略了结束分号。 还在工作。 所以我试图在foreach循环中使用if / else语句而不使用大括号,并且仍然工作,没有错误。 但是,foreach循环现在真的closures/结束了吗?

 foreach($var as $value) if(1 + 1 == 2) $arr[] = $value; 

至less我再次省略了结尾分号,并且(按预期)发生了一个parsing错误。

所以我的大问题是:什么时候可以省略花括号和结构/循环/函数? 我知道我可以在ifelse这样做。 但是,什么while ,为什么和foreach

是的,我知道这是不安全的,聪明的,无论代码没有大括号,还有像$condition ? true : false;这样的shorthands $condition ? true : false; $condition ? true : false; if: doSomething(); endif; if: doSomething(); endif;endfor;endforeach; 。 我不想了解shorthands我只是想了解何时何地可以省略大括号的条件。

如果省略大括号,则只会将下一个语句视为条件的主体。

 if ($x) echo 'foo'; 

是相同的

 if ($x) { echo 'foo'; } 

但请记住

 if ($x) echo 'foo'; echo 'bar'; 

始终打印“酒吧”

在内部,相反: if只看下一个expression式,但PHP将{}中的所有内容视为单个“分组”expression式。

其他控制语句( foreach等)也是如此

有些地方你可以,但你永远不应该。

显式总是比隐式更好。

谁知道什么时候你必须回去修改旧的代码。 很容易错过这些东西,这样做没有任何好处。

如果你在里面只有一个参数,它会工作正常! 但是,如果你想省略大括号,你可以使用冒号和结束。 例:

 if(a < 1 ) : echo "a is less than 1"; else : echo "a is greater than 1"; endif; 

我在我的PHP模板中省略了大括号。 例如,你可以使用循环如下:

 <ul> <?php foreach ($var as $value): ?> <li><?php echo $value; ?></li> <?php endforeach; ?> </ul> 

正如你所说的,你不想学习速记 ,接受的答案给出了一个很好的例子,省略了curly braces ,但有一些补充。 正如你所看到的,在if ($x) echo 'foo';情况下可以省略curly braces if ($x) echo 'foo'; 。 代码没有任何问题,没有性能或其他问题,它是其他开发人员可读的。 例如,如果你写,也会显示你

 if ($x) echo 'foo'; echo 'bar'; 

代替

 if ($x) echo 'foo'; echo 'bar'; 

如果打印出的bar不希望被打印出来,并且如果你的代码中充满了这样的语句,那么你可能会遇到不希望的结果,这会使你更难阅读自己的代码,而更难让别人阅读它。

我不想了解简写,我只是想了解何时何地可以省略大括号的条件。

这些东西是密切相关的,所以如果你真的想明白哪里可以省略大括号,那么这应该是你必须理解或至less知道速记的,已阅读

  1. PHP控制结构
  2. PHP三元条件运算符和expression式一般

所以我的大问题是:什么时候可以省略花括号和结构/循环/函数?

不过,大括号并不是必需的,但为了便于阅读和维护,许多开发人员会认为不包括它们的风格。 以前的2个链接应该为您提供所需的信息来做出自己的决定,当你可以省略大括号。 例如,下面的代码段完全一样,没有什么不对。

用大括号

 if (PHP_VERSION_ID < 70000) { print "PHP >= 7.0 required yours is "; print phpversion(); print "\n"; exit(1); } 

和…一样

 if (PHP_VERSION_ID < 70000) : print "PHP >= 7.0 required yours is "; print phpversion(); print "\n"; exit(1); endif; 

或者你可以使用点运算符

 if (PHP_VERSION_ID < 80000) (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1); 

而且你可以利用三元条件运算符,甚至可以省略, if它自己除了大括号

 (PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1); 

由于我们只打印,我们可以缩短,并剥离一些print string functions ,这些print string functions在这里代表多个函数在没有大括号

 (PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "\n") . exit(1); 

从PHP 7我们可以使用空合并运算符

 (PHP_VERSION_ID > 70000) ?: null ?? (print "PHP >= 7.0 required yours is ".phpversion() . "\n") . exit(1); 

正如人们可以看到,有很多方法可以得到完全相同的结果。 这不仅适用于这个例子,而且可以用structure/loop/function 。 所以没有人回答你的大问题 。 主要应该考虑以下几点。

  1. 您正在编写的代码易于维护。
  2. 你可以回答你的自我是否有你通过省略大括号而获胜。

你可以用它来做简单的事情,比如:

 if($a === true) continue; 

但是对于一些更复杂的子条件,它可能会导致你的问题:

  $a = false; $b = false; if ($a === true) if ($b === true) echo 1; else echo 2; 

用上面的代码,你会期望看到“2”作为输出,但你不会。

对于单行语句。

如果你试图做

 foreach($array as $x => $y) $do_something = $x; $do_something_else = $y; 

除非我误解了,PHP解释器会将foreach语句下的第二行作为隐含括号的外部

如果您稍后再回到此代码,或者其他开发人员查看了您的工作,则会导致混淆。

因此,总是在这些陈述中使用大括号是明智的。 这将节省后来的头痛/困惑

要补充@Marko的答案,请注意,在使用点运算符处理此问题时,应将每个操作括在括号内,否则将颠倒顺序。

例如,下面的代码将打印PHP >= 7.0 required yours is 5.6.15

 (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n"); 

虽然这将打印5.6.151PHP >= 7.0 required yours is 1

 print("PHP >= 7.0 required yours is ") . print(phpversion()) . print("\n"); 

你也可以使用and运算符来工作。 像这样:

 if (PHP_VERSION_ID < 70000) print("PHP >= 7.0 required yours is ") and print(phpversion()) and print("\n"); 

当你的子句/后面只有一个expression式时,

例如,

 foreach($var as $value) if(1 + 1 == 2) { $arr[] = $value; }; 

是正确的,但是

 foreach($var as $value) $somevar = $var; if(1 + 1 == 2) { $arr[] = $value; }; 

是不是,php解释器会认为if声明是在foreach

答案很简单。 这在C / C ++中是一样的。

如果if / else,if / else if / else和loops =>如果下一条语句是单行,则可以省略大括号。

例如:

 for($i= 0; $i<=100; $i++) { if($i % 7 == 0) { echo $i . "<br>"; } } 

它也可以这样写:

 for($i= 0; $i<=100; $i++) if($i % 7 == 0) echo $i . "<br>";