PHP简写逻辑运算符AND和OR


PHP shorthand logical operators AND and OR

可能的重复:
PHP-和/或关键字
PHP简写语法

快速提问。我经常在各地的库中看到简写表达式,尽管我已经做了3年多的PHP开发人员,但我很难完全理解以下内容的评估结果。

当PHP解释器遇到以下简写的代码行时,它究竟该如何处理它们?

<?php
    defined('foo') OR exit('foo is not defined!');
    $foo AND $this->bar();

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

有人能详细说明吗?

感谢:)

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

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

true OR do_something();

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

当我学习PHP时,我记得我读过"要么做,要么死"风格的命令,当时没有完全理解它们,经典的例子是:

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

请记住,这些条件只有在需要时才会运行,例如:

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

这里,b==c只有在a==b的情况下才会被测试。同样的理论适用于或:

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!');

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

Mat

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

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

有时您有一个函数看起来像:

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

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

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

"…do something"不会被执行,因为函数作为一个整体返回false。

return$foo&amp$bar表示两个变量都必须为true,函数才能返回true。

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