Mun*_*sir 65 php if-statement short-circuiting
给出以下代码:
if (is_valid($string) && up_to_length($string) && file_exists($file))
{
......
}
Run Code Online (Sandbox Code Playgroud)
如果is_valid($string)返回false,那么php解释器是否仍会检查后面的条件,如false?如果是这样,那么为什么它不需要做额外的工作呢?
Zac*_*ner 92
是的,PHP解释器是"懒惰的",这意味着它将进行最小数量的比较来评估条件.
如果您想验证,请尝试以下方法:
function saySomething()
{
echo 'hi!';
return true;
}
if (false && saySomething())
{
echo 'statement evaluated to true';
}
Run Code Online (Sandbox Code Playgroud)
是的,它确实.这是一个依赖于短路评估的小技巧.有时您可能会有一个小的if语句,您更愿意将其写成三元组,例如:
if ($confirmed) {
$answer = 'Yes';
} else {
$answer = 'No';
}
Run Code Online (Sandbox Code Playgroud)
可以重写为:
$answer = $confirmed ? 'Yes' : 'No';
Run Code Online (Sandbox Code Playgroud)
但是如果yes块也需要运行某些功能呢?
if ($confirmed) {
do_something();
$answer = 'Yes';
} else {
$answer = 'No';
}
Run Code Online (Sandbox Code Playgroud)
那么,由于短路评估,仍然可以重写为三元组:
$answer = $confirmed && (do_something() || true) ? 'Yes' : 'No';
Run Code Online (Sandbox Code Playgroud)
在这种情况下,表达式(do_something()|| true)不会改变三元组的整体结果,但只有在$ confirm为true时才能确保do_something()运行.
小智 7
按位运算符是&和|。他们总是评估两个操作数。
逻辑运算符是AND,OR,&&,和||。
AND并且OR具有比&&and低的优先级||。请参阅下面的示例。
从 PHP 手册:
// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;
// The constant false is assigned to $f before the "or" operation occurs
// Acts like: (($f = false) or true)
$f = false or true;
Run Code Online (Sandbox Code Playgroud)
在这个例子中,ewill betrue和fwill be false。
根据我现在的研究,PHP 似乎没有&&与 JavaScript相同的短路运算符。
我运行了这个测试:
$one = true;
$two = 'Cabbage';
$test = $one && $two;
echo $test;
Run Code Online (Sandbox Code Playgroud)
和 PHP 7.0.8 返回1,而不是Cabbage。