【问题标题】:PHP Lazy Boolean EvaluationPHP 惰性布尔求值
【发布时间】:2011-05-12 03:10:53
【问题描述】:

因此我有一个条件语句:

if($boolean && expensiveOperation()){ ...}

PHP 是否有惰性布尔求值,即它会检查$boolean,如果它是假的,不打扰执行昂贵的操作?如果是这样,我应该按什么顺序放置变量?

【问题讨论】:

  • 如果两个操作本质上不相关,我通常会避免将它们放在同一行代码中。它使可读性变得困难,并且您不会获得计算时间或资源。
  • Apols 我的错误答案(现已删除)。我以为我记得尝试过这个并发现它不起作用,但我显然错了。
  • @Nathan 至少你有一个 Peer Pressure 徽章 :)
  • @Alin Purcaru 这是好事吗? :)
  • @Nathan 这表明你有责任心......或者害怕失去声誉点。

标签: php lazy-evaluation


【解决方案1】:

是的。这称为短路评估。见documentation page上的cmets...

对于顺序,它根据Operator Precedence 执行检查,然后从左到右。所以:

A || B || C

将首先评估 A,仅当 A 为假时才评估 B,仅当 A 和 B 都为假时才评估 C...

但是

A AND B || C

将始终评估B || C,因为|| 的优先级高于AND&& 不是这样)。

【讨论】:

  • 如果您想要非短路评估,您可以使用单个 & 这将是一个布尔联合函数。它会计算这两个值,然后尝试在它们之间执行 AND。
  • @Mikhail:是的。但是你必须小心,因为单 & 实际上是一个位运算符。所以true & 2 是假的(因为true00000001,而200000010,所以AND00000000)...
  • @Alin:谢谢! Dam google 将我带到了错误的文档...已在答案中修复。谢谢!
【解决方案2】:

是的,PHP 支持short-circuit evaluation

【讨论】:

    【解决方案3】:

    PHP 确实有短路评估。您的示例将是正确使用它:

    http://en.wikipedia.org/wiki/Short-circuit_evaluation#Support_in_common_programming_languages

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2023-03-08
      • 2012-08-31
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多