【问题标题】:PHP if executionPHP if 执行
【发布时间】:2016-10-18 09:23:41
【问题描述】:

在 PHP 中,如果您有以下代码,是否会评估 $b,因为 $a 会导致 if 语句返回 false?

$a = false;
$b = true;

if ($a && $b) {
  // more code here
}

如果 $b 确实得到了评​​估,是否存在由于处理器已经知道该值为 false 而不评估 if 语句的一部分的情况?

【问题讨论】:

  • Iirc,不,评估将在 $a 处停止(并失败)。
  • php 的评估相当懒惰。由于 $a 为假,无论 $b 是什么,表达式都会为假,因此没有理由评估 $b。 (在手册和教程中广泛介绍,AFAICR)。此外,您可以使用回显某些内容并返回布尔值的函数来检查自己。
  • 不,它不会被评估,因为它会短路。
  • 还有 opcache 的情况下整个 if 没有被执行。
  • 理论上,您不应该假设操作顺序,因为未来的版本可能会更改它并评估$b,然后是$a。在实践中,每个人都已经假设 $b 没有被评估,所以这种变化是否会发生是值得怀疑的,所以就目前而言,$a 被评估,如果它是错误的,那么整个 if 失败(没有评估 $b )

标签: php if-statement operator-precedence


【解决方案1】:

&& 的评估在达到false 条件后立即停止。

这些 (&&) 是短路运算符,因此如果第一个条件为真(在 OR 的情况下)或假(在 AND 的情况下),它们不会检查第二个条件。

参考:http://php.net/manual/en/language.operators.logical.php


来自文档:

<?php

// --------------------
// foo() will never get called as those operators are short-circuit

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());

【讨论】:

    【解决方案2】:

    一旦知道结果,逻辑表达式的计算就会停止

    如果$a 为假,$b 将不会被评估,因为它不会改变 ($a &amp;&amp; $b) 结果。

    这样做的结果是,如果$b 的评估比$a 的评估需要更多的资源,则以$a 开始您的测试条件。

    但请注意

    PHP 没有(在一般情况下)指定表达式的求值顺序,并且应避免使用假定特定求值顺序的代码,因为行为可能会在 PHP 版本之间或取决于周围的代码而改变。 (Source php docs)

    因此,如果 $a 为假,您不应假设永远不会评估 $b,因为它可能会在未来发生变化(说 php 文档)。

    【讨论】:

    • 感谢您提供有用的说明
    猜你喜欢
    • 2011-05-19
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多