PHP - if/else,for,foreach,while - 没有花括号?

hea*_*der 51 php foreach if-statement curly-braces

真正想知道但从未发现的东西是PHP的快捷方式.

我目前正在编写一个带有foreach循环的函数,里面只有一个语句.我试图省略花括号,因为你可以在if/else控制结构中做,它可以工作.没有错误.

foreach($var as $value)
    $arr[] = $value;
Run Code Online (Sandbox Code Playgroud)

现在我尝试以相同的方式使用它,但在其中放入一个if/else块.再次,工作,没有错误.

foreach($var as $value)
    if(1 + 1 == 2) {
        $arr[] = $value;
    };
Run Code Online (Sandbox Code Playgroud)

然后,我想"为什么这有效?" 并省略了结束分号.还在工作.所以我尝试在foreach循环中使用if/else语句而没有花括号,并再次使用,仍然正常,没有错误.但是foreach循环现在真的关闭/结束了吗?

foreach($var as $value)
    if(1 + 1 == 2)
        $arr[] = $value;
Run Code Online (Sandbox Code Playgroud)

至少我再次省略了结束分号并且(正如预期的那样)发生了解析错误.

所以我的大问题是:我什么时候可以省略花括号和结构/循环/函数?我知道,我可以肯定地在这样做ifelse.可是你知道while,forforeach

是的,我知道这是不是安全,智能,无论到代码,而无需花括号,并有像速记$condition ? true : false;if: doSomething(); endif;,endfor;endforeach;.我不想了解shorthands我只想了解有关何时何地可以省略大括号的条件.

Kin*_*nch 82

省略大括号时,它只会将下一个语句视为条件的主体.

if ($x) echo 'foo';
Run Code Online (Sandbox Code Playgroud)

是相同的

if ($x) { echo 'foo'; }
Run Code Online (Sandbox Code Playgroud)

但请记住

if ($x)
  echo 'foo';
  echo 'bar';
Run Code Online (Sandbox Code Playgroud)

永远打印"酒吧"

在内部它是另一种方式:if只会查看下一个表达式,但PHP会将所有内容{}视为单个"分组"表达式.

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

  • 有一个例外;它不适用于[异常](http://php.net/manual/en/language.exceptions.php)。双关语完全是故意的。 (3认同)

tko*_*one 27

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

显式总是优于隐式.

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


sit*_*ats 13

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

if(a < 1 ) :
    echo "a is less than 1";
else :
    echo "a is greater than 1";
endif;
Run Code Online (Sandbox Code Playgroud)


mku*_*gla 5

正如你所说,你不想学习速记和接受的答案给出了省略的好例子curly braces,但有一些东西需要补充.正如你可以看到它您可以省略curly braces的情况下if ($x) echo 'foo';.代码,性能或其他问题没有任何问题,其他开发人员可以读取.例子也告诉你,如果你写

if ($x)
    echo 'foo';
    echo 'bar';
Run Code Online (Sandbox Code Playgroud)

代替

if ($x)
    echo 'foo';

echo 'bar';
Run Code Online (Sandbox Code Playgroud)

你可能会遇到不需要的结果,bar而你不希望它被打印出来,如果你的代码充满了这样的陈述,那么你将更难以阅读自己的代码,更难以让其他人阅读它.

我不想学习速记,我只想了解有关何时何地可以省略大括号的条件.

这些事情是密切相关的,所以如果你真的想要了解哪些地方可以省略大括号那么这应该是你理解或至少知道速记的必须,已阅读

  1. PHP控件结构
  2. PHP三元条件运算符和表达式

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

然而,大括号不是必需的,为了便于阅读和维护,许多开发人员认为不包括它们是不好的风格.以前的2个链接应该为您提供在省略大括号时做出自己决定所需的信息.例如,以下代码片段没有任何问题,这些代码片段完全相同.

用大括号

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

是一样的

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

或者您可以使用点运算符

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

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

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

因为我们只打印,所以我们可以缩短它并删除一些print string functions在这里代表多个函数的语句而不用花括号

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

从php 7开始,我们可以使用Null合并运算符

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

可以看出,有很多方法可以得到完全相同的结果.这不仅适用于这个if例子,但同样可以实践structure/loop/function.所以对你的大问题没有一个答案.人们应该主要考虑如下.

  1. 您编写的代码是否易于维护.
  2. 你可以通过省略花括号来回答你的自我吗?