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

时间:2012-01-04 11:45:39

标签: php if-statement foreach curly-braces

真正想知道但从未发现的东西是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循环现在真的关闭/结束了吗?

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

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

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

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

12 个答案:

答案 0 :(得分:77)

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

if ($x) echo 'foo';

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

但请记住

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

始终打印“bar”

在内部,反过来说:if只会查看下一个表达式,但PHP会将{}中的所有内容视为单个“分组”表达式。

其他控制语句(foreach等)相同

答案 1 :(得分:26)

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

明确始终优于隐式。

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

答案 2 :(得分:11)

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

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

答案 3 :(得分:5)

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

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

而不是

if ($x)
    echo 'foo';

echo 'bar';

如果在您不希望打印bar时打印出不需要的结果,并且如果您的代码中充满了此类声明,那么您将更难以阅读自己的内容代码,甚至更难以让其他人阅读它。

  

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

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

  1. PHP Control Structures
  2. The PHP ternary conditional operators and expressions in general
  3.   

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

    然而,大括号不是必需的,为了便于阅读和维护,许多开发人员认为不包括它们的风格很糟糕。以前的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,这些(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "\n") . exit(1); 在这里代表多个函数的语句中没有花括号

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

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

    if

    正如人们可以看到,有很多方法可以得到完全相同的结果。这不仅适用于此structure/loop/function示例,也可以与15:47:04.750 Pjsua.c : Error creating transport UDP: Address already in use [status=120048] 一起使用。所以对于你的大问题没有一个答案。人们应该主要考虑以下事项。

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

答案 4 :(得分:3)

我省略了PHP模板中的花括号。例如。您可以按如下方式使用循环:

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

答案 5 :(得分:2)

您可以将它用于简单的事情:

if($a === true) continue;

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

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

使用上面的代码,您可能会看到&#34; 2&#34;作为输出,但你不会。

答案 6 :(得分:1)

对于单行声明。

如果您尝试

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

除非我弄错了,否则php解释器会将foreach语句下的第二行视为隐含的括号之外

由于缩进,如果您以后再回到此代码,或者其他开发人员查看了您的工作,那将会令人困惑。

因此,总是明智地总是使用这些语句的大括号。它将节省以后的头痛/困惑

答案 7 :(得分:1)

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

例如,下面的代码将打印(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"); 运算符来实现此功能。像这样:

Product_description

答案 8 :(得分:0)

当您的子句/

之后只有一个表达式时,这是可能的

例如,

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之外

答案 9 :(得分:0)

答案很简单。这与C / C ++相同。

if if if / else,if / else if / else和loops =&gt;如果下一个语句是一行,则可以省略大括号。

例如:

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>";

答案 10 :(得分:0)

  

何时可以省略花括号以及在哪个结构/循环/功能中?   我知道我绝对可以在其他情况下这样做。但是关于   同时,for和foreach?

对于 If / else ,可以使用以下结构将单个多个语句不带花括号:

<?php
  if ($x):
    echo 'foo';
    echo 'bar';
  else:
    echo 'nofoo';
    echo 'nobar';
  endif;
?>

this answer

中所述

对于同时对于 foreach ,仅允许单个语句,不带大括号

<?php
foreach($array as $x => $y)
    $do_something = $x;
?>

答案 11 :(得分:0)

从PHP 5.3开始提供PHP速记表达式

query