PHP有短路评估吗?

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)

  • 短路评估!=懒惰. (16认同)
  • @RaduMurzea:短路不是我期望被切换的东西,因为它可能对整个程序和导入的库产生不利影响.考虑在读取变量之前检查变量是否设置的情况`if(isset($ var ['index'])&& $ var ['index'] ==="something")`.如果需要在布尔表达式中计算每个条件,则在if语句之前计算并保存它们,然后在if条件中检查结果. (5认同)

Rob*_*ert 8

是的,它确实.这是一个依赖于短路评估的小技巧.有时您可能会有一个小的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

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

逻辑运算符ANDOR&&,和||

  • 所有四个运算符仅在需要时评估右侧。
  • 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 betruefwill be false

  • *"AND 和 OR 总是计算两个操作数。"* -- 这不是真的。它们的优先级仅比 `&&` 和 `||` 低,但除此之外,它们的语义与 `&&` 和 `||` 相同。 (8认同)

agm*_*984 5

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

我运行了这个测试:

$one = true;

$two = 'Cabbage';

$test = $one && $two;

echo $test;
Run Code Online (Sandbox Code Playgroud)

和 PHP 7.0.8 返回1,而不是Cabbage

  • 我认为 `&&` 会导致 php 将所有内容转换为布尔值,以便将 `$two` 转换为 `true`,然后回显为 `1`。您需要“true||(echo 'no Short Circuit')”来测试它(或类似的东西)。 (4认同)