PHP有短路评估吗?
2022-08-30 08:09:46
给定以下代码:
if (is_valid($string) && up_to_length($string) && file_exists($file))
{
......
}
如果返回,php解释器是否仍然检查后面的条件,例如?
如果是这样,那么为什么它不需要做额外的工作呢?is_valid($string)
false
up_to_length($string)
给定以下代码:
if (is_valid($string) && up_to_length($string) && file_exists($file))
{
......
}
如果返回,php解释器是否仍然检查后面的条件,例如?
如果是这样,那么为什么它不需要做额外的工作呢?is_valid($string)
false
up_to_length($string)
是的,PHP解释器是“懒惰的”,这意味着它将进行尽可能少的比较来评估条件。
如果要验证这一点,请尝试以下操作:
function saySomething()
{
echo 'hi!';
return true;
}
if (false && saySomething())
{
echo 'statement evaluated to true';
}
是的,确实如此。这里有一个依赖于短路评估的小技巧。有时你可能有一个小的if语句,你更喜欢写成三元,例如:
if ($confirmed) {
$answer = 'Yes';
} else {
$answer = 'No';
}
可以重写为:
$answer = $confirmed ? 'Yes' : 'No';
但是,如果 yes 块也需要运行某些函数呢?
if ($confirmed) {
do_something();
$answer = 'Yes';
} else {
$answer = 'No';
}
好吧,由于短路评估,重写为三元仍然是可能的:
$answer = $confirmed && (do_something() || true) ? 'Yes' : 'No';
在这种情况下,表达式 (do_something() || true) 不会改变三元的整体结果,而是确保三元条件保持不变,忽略 的返回值。true
do_something()