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错误。
所以我的大问题是:什么时候可以省略花括号和结构/循环/函数? 我知道我可以在if
和else
这样做。 但是,什么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知道速记的,已阅读
- PHP控制结构
- 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
。 所以没有人回答你的大问题 。 主要应该考虑以下几点。
- 您正在编写的代码易于维护。
- 你可以回答你的自我是否有你通过省略大括号而获胜。
你可以用它来做简单的事情,比如:
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>";