真正想知道但从未发现的东西是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
,for
和foreach
呢?
是的,我知道它不安全,聪明,没有花括号的代码,还有像$condition ? true : false;
和if: doSomething(); endif;
,endfor;
和endforeach;
这样的短篇小说。我不想了解shorthands我只想了解有关何时何地可以省略大括号的条件。
省略大括号时,它只会将下一个语句视为条件的主体。
if ($x) echo 'foo';
是相同的
if ($x) { echo 'foo'; }
但请记住
if ($x)
echo 'foo';
echo 'bar';
将永远打印“酒吧”
在内部,它是另一种方式:if
只会查看下一个表达式,但PHP会将{}
中的所有内容视为单个“分组”表达式。
其他控制语句(foreach
等)相同
答案很简单。这在C / C ++中是相同的。
if,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>";
我什么时候可以省略花括号和结构/循环/函数?我知道我绝对可以在if和else中这样做。但是,对于while,for和foreach呢?
对于If / else,通过使用以下构造,可以使用不带花括号的单个和多个语句:
<?php
if ($x):
echo 'foo';
echo 'bar';
else:
echo 'nofoo';
echo 'nobar';
endif;
?>
如this answer所述
对于while,for和foreach,只允许使用单个语句而不使用大括号
<?php
foreach($array as $x => $y)
$do_something = $x;
?>
从PHP 5.3开始,PHP速记表达式可用
$condition ? $value_if_true : $value_if_false
$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )
有些地方你可以,但你永远不应该。
显式总是优于隐式。
谁知道什么时候你不得不回去修改旧代码。很容易错过这些东西,这样做没有任何好处。
如果你里面只有一个参数,它会正常工作!但是如果你想省略花括号,你可以使用冒号和结束。例:
if(a < 1 ) :
echo "a is less than 1";
else :
echo "a is greater than 1";
endif;
如你所说,你不想学习速记和接受的答案给出了省略curly braces
的好例子,但有一些东西需要补充。你可以看到在curly braces
的情况下省略if ($x) echo 'foo';
是好的。代码,性能或其他问题没有任何问题,其他开发人员可以读取。例子也告诉你,如果你写
if ($x)
echo 'foo';
echo 'bar';
代替
if ($x)
echo 'foo';
echo 'bar';
当你不希望打印bar
时会遇到不需要的结果,如果你的代码中充满了这些语句,那么你将更难以阅读自己的代码,让其他人更难阅读它。
我不想学习速记,我只想了解有关何时何地可以省略大括号的条件。
这些事情是密切相关的,所以如果你真的想要了解哪些地方可以省略大括号那么这应该是你理解或至少知道速记的必须,已阅读
所以我的大问题是:我什么时候可以省略花括号和结构/循环/函数?
然而,大括号不是必需的,为了便于阅读和维护,许多开发人员认为不包括它们是不好的风格。以前的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
实践。所以对你的大问题没有一个答案。人们应该主要考虑以下事项
我省略了PHP模板中的花括号。例如。你可以使用循环如下:
<ul>
<?php foreach ($var as $value): ?>
<li><?php echo $value; ?></li>
<?php endforeach; ?>
</ul>
您可以将它用于简单的事情,例如:
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");
当你的子句/你之后只有一个表达式时,它是可能的
例如,
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
之外