57

真正想知道但从未发现的东西是 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;

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

所以我的大问题是:我什么时候可以省略花括号以及在哪个结构/循环/功能中?我知道我绝对可以在if和中这样做else。但是和while呢?forforeach

是的,我知道它不安全、不聪明,不带花括号的代码是不安全的、不聪明的,并且有诸如$condition ? true : false;and 和if: doSomething(); endif;andendfor;之类的简写endforeach;。我不想了解速记我只想了解何时何地可以省略大括号的条件。

4

12 回答 12

92

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

if ($x) echo 'foo';

是相同的

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

但请记住

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

始终打印“bar”

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

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

于 2012-01-04T11:48:23.543 回答
33

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

显式总是比隐式好。

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

于 2012-01-04T11:51:30.807 回答
17

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

if(a < 1 ) :
    echo "a is less than 1";
else :
    echo "a is greater than 1";
endif;
于 2012-01-04T12:46:37.820 回答
10

如前所述,您不想了解速记和接受的答案给出了关于省略的好例子curly braces,但还有一些东西要补充。如您所见,curly bracesif ($x) echo 'foo';. 代码没有问题,没有性能或其他问题,其他开发人员可以阅读。示例还向您展示,如果您写

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

代替

if ($x)
    echo 'foo';

echo 'bar';

您可能会在不bar希望打印的情况下遇到不需要的结果,如果您的代码中充满了此类语句,那么您将更难阅读自己的代码,而其他人则更难以阅读它.

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

这些东西是密切相关的,所以如果你真的想了解在哪里可以省略大括号,那么你必须了解或至少知道速记,阅读

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

所以我的大问题是:我什么时候可以省略花括号以及在哪个结构/循环/功能中?

然而,花括号不是必需的,为了可读性和维护,许多开发人员会认为不包含它们是不好的风格。当您可以省略花括号时,前 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 7 开始,我们可以使用 Null 合并运算符

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

可以看出,有很多方法可以获得完全相同的结果。这不仅适用于这个if例子,而且同样可以用structure/loop/function. 所以你的大问题没有一个答案。应主要考虑以下。

  1. 您正在编写的代码是否易于维护。
  2. 您能否为自己回答是否通过省略花括号可以赢得一些东西。
于 2016-01-25T20:04:50.980 回答
3

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

<ul>
    <?php foreach ($var as $value): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>
于 2012-01-04T11:51:26.660 回答
3

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

if($a === true) continue;

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

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

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

于 2015-05-21T08:03:12.087 回答
2

为了补充@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");
于 2016-07-31T18:02:22.677 回答
1

对于单行语句。

如果你试图做

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

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

由于缩进,如果您稍后返回此代码,或者其他开发人员查看您的工作,这会令人困惑。

因此,在这些语句中始终使用大括号通常是明智的。它将节省以后的头痛/困惑

于 2012-01-04T11:49:12.887 回答
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

于 2012-01-04T11:48:13.387 回答
0

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

if, if/else, if/else if/else and 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>";
于 2015-04-21T10:46:30.747 回答
0

我什么时候可以省略花括号以及在哪个结构/循环/功能中?我知道我绝对可以在 if 和 else 中这样做。但是 while、for 和 foreach 呢?

对于If/else,通过使用以下构造,可以使用不带花括号的单个多个语句:

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

本答案所述

对于whileforforeach,只允许没有大括号的单个语句

<?php
foreach($array as $x => $y)
    $do_something = $x;
?>
于 2018-08-08T10:39:08.153 回答
0

PHP 速记表达式从 PHP 5.3 开始可用

$condition ? $value_if_true : $value_if_false

$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )
于 2018-09-19T05:53:07.093 回答