【问题标题】:PHP shorthand logical operators AND and OR [duplicate]PHP速记逻辑运算符AND和OR [重复]
【发布时间】:2011-09-18 17:13:51
【问题描述】:

可能的重复:
PHP - and / or keywords
PHP shorthand syntax

快速提问。我一直在这个地方的库中看到速记表达式,尽管我已经做了 3 年多的 PHP 开发人员,但我很难完全了解以下内容的评估方式。

PHP 解释器在遇到以下简写代码行时究竟会做什么?

<?php
    defined('foo') OR exit('foo is not defined!');

    $foo AND $this->bar();

我猜这显然是条件执行——即除非第一位为真,否则第二个语句不会被执行......但是按位运算符的使用让我有点困惑。

有人可以详细说明吗?

谢谢:)

【问题讨论】:

  • @Gordon - 不,不是。我知道 && 与 AND 相同,与 || 相同和或。我在询问速记逻辑 - 现在已向我指出短路评估。
  • 有人刚刚将我与此链接。你到底是什么问题?
  • 我只是指出可能的重复。在旁注中,用那个链接回答的人不应该用那个链接回答。它应该是评论或近距离投票。这就是为什么我将它复制到这里并将他的答案标记为不是答案的原因。这一切都只是家务。

标签: php logical-operators


【解决方案1】:

我认为这是短路评估的一种形式:http://en.wikipedia.org/wiki/Short-circuit_evaluation

本质上,在评估整个表达式时,解释器一旦确定结果就会短路。例如:

true OR do_something();

这个表达式从不调用do_something(),因为OR的第一个操作数为真,所以整个表达式必须为真。

【讨论】:

    【解决方案2】:

    我记得在我学习 PHP 的时候,我读过 'do or die' 风格的命令,当时并没有完全理解它们,经典的例子是:

    mysql_connect() or die('couldn\'t connect');
    

    请记住,条件仅在需要时才会运行,例如:

    if (a == b && b == c)
    

    这里 b == c 只有在 a == b 时才会被测试。相同的理论适用于 or:

    if (a == b || b == c)
    

    现在 b == c 只有在 a != b 时才会被测试。

    在这种情况下,您在某些条件下依赖此命令来运行命令(exit 或 $this->bar())。

    注意... exit() 在这种情况下是个坏主意 - 如果您退出('出现问题'),任何人都无法向用户隐藏此错误,也它可能会发出 200 OK HTTP 状态,而 500 内部服务器错误更合适,我会考虑更像:

    defined('foo') OR throw new Exception('foo is not defined!');
    

    在这里您有机会捕获异常,或者至少让 PHP 捕获它并发出 500 状态。

    垫子

    【讨论】:

    • 嘿,垫子,谢谢你的回答。是的,我知道这根本不是最好的方法。实际上,我只是从 CodeIgniter 核心中的大多数文件中提取了示例......这是一个高度面向 PHP 4 的框架。
    【解决方案3】:

    远没有你想象的那么复杂。 or 关键字与 || 相同,只是它的优先级较低。有关详细信息,请参阅corresponding PHP page

    此语句的实际执行依赖于一个涉及逻辑运算符的单独概念:短路。这意味着,在or 的情况下,如果第一个语句结果为真,则不会评估第二个语句。 (例如,由于在条件中,整个条件将返回 true,而无需查看后半部分。)

    【讨论】:

      【解决方案4】:

      有时你有一个看起来像这样的函数:

      function test()
      {
          $foo = TRUE;
          $bar = FALSE;
      
          return $foo && $bar;
      }
      

      在这种情况下,如果有的话:

       $bla = test();
       if($bla) {
         ... do something
       }
      

      “...做某事”不会被执行,因为函数作为一个整体返回 false。

      return $foo && $bar 意味着两个变量都必须为真,函数才能返回真。

      另一方面,如果它声明:return $foo || $酒吧;那么该函数将返回 true,因为至少有一个变量为 true。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 2018-07-22
        • 2013-07-16
        • 1970-01-01
        相关资源
        最近更新 更多