PHP有短路评估吗?

时间:2011-04-17 16:25:54

标签: php if-statement short-circuiting

给出以下代码:

if (is_valid($string) && up_to_length($string) && file_exists($file)) 
{
    ......
}

如果is_valid($string)返回false,那么php解释器是否仍会检查up_to_length($string)之后的条件?如果是这样,那么为什么它不需要做额外的工作呢?

9 个答案:

答案 0 :(得分:89)

是的,PHP解释器是“懒惰的”,这意味着它将进行最小数量的比较来评估条件。

如果您想验证这一点,请尝试以下方法:

function saySomething()
{
    echo 'hi!';
    return true;
}

if (false && saySomething())
{
    echo 'statement evaluated to true';
}

答案 1 :(得分:7)

是的,确实如此。这是一个依赖于短路评估的小技巧。有时你可能会有一个小的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)不会改变三元组的整体结果,但只有在$ confirm为true时才能确保do_something()运行。

答案 2 :(得分:2)

不,如果不满足第一个条件,它不再检查其他条件。

答案 3 :(得分:0)

因此总结如下:

按位运算符是&和|
他们总是评估两个操作数。

逻辑运算符是AND,OR,&&和||
AND和OR总是评估两个操作数。

&安培;&安培;和||只有在需要时才评估右侧。

答案 4 :(得分:0)

根据我现在的研究,PHP似乎没有与JavaScript相同的foo_1短路运算符。

我运行了此测试:

&&

,PHP 7.0.8返回$one = true; $two = 'Cabbage'; $test = $one && $two; echo $test; ,而不是1

答案 5 :(得分:-1)

不,不。这始终是优化条件顺序的好地方。

答案 6 :(得分:-1)

我已经创建了自己的短路评估逻辑,遗憾的是它不像javascripts快速语法,但也许这是一个你可能会觉得有用的解决方案:

$short_circuit_isset = function($var, $default_value = NULL) {
    return  (isset($var)) ? : $default_value;
};

$return_title = $short_circuit_isset( $_GET['returntitle'], 'God');

// Should return type 'String' value 'God', if get param is not set

我不记得我从哪里获得了以下逻辑,但是如果你做了以下这些;

(isset($var)) ? : $default_value;

您可以跳过必须在问号之后再次写入真实条件变量,例如:

(isset($super_long_var_name)) ? $super_long_var_name : $default_value;

作为非常重要的观察,当以这种方式使用三元运算符时,您会注意到如果进行比较,它只会传递该比较的值,因为不只有一个变量。 E.g:

$num = 1;
$num2 = 2;
var_dump( ($num < $num2) ? : 'oh snap' );
// outputs bool 'true'

答案 7 :(得分:-4)

Side note: If you want to avoid the lazy check and run every part of the condition, in that case you need to use the logical AND like this:

if (condition1 & condition2) {
 echo "both true";
}
else {
 echo "one or both false";
}

This is useful when you need for example call two functions even if the first one returned false.

答案 8 :(得分:-5)

我的选择:信任PHP中的短路评估...

function saySomething()
{
    print ('hi!');
    return true;
}

if (1 || saySomething())
{
    print('statement evaluated to true');
}

条件 1 ||中的第二部分saySomething()是无关紧要的,因为这总是会返回true。不幸的是 saySomething()被评估&amp;执行。

也许我误解了短路表达式的确切逻辑,但这看起来不像“它会对我做最小数量的比较”

此外,这不仅仅是一个性能问题,如果你在比较中做作业,或者如果你做了一些有所作为的事情,除了比较一些东西,你可能会得到不同的结果。

无论如何......小心点。