快速提问。我一直在这个地方的图书馆看到速记表达,尽管已经有3年多的PHP开发人员,但我很难看到以下内容将如何评估。
PHP解释器遇到以下简写代码时究竟做了什么?
<?php
defined('foo') OR exit('foo is not defined!');
$foo AND $this->bar();
我猜测它显然是条件执行 - 即第二个语句不会被执行,除非第一个位是真的......但是使用按位运算符会让我感到困惑。
有人可以详细说明吗?
谢谢:)
答案 0 :(得分:4)
我认为这是一种短路评估形式:http://en.wikipedia.org/wiki/Short-circuit_evaluation
基本上,在评估整个表达式时,解释器一旦确定结果就会短路。例如:
true OR do_something();
此表达式从不调用do_something(),因为OR的第一个操作数为true,因此整个表达式必须为true。
答案 1 :(得分:2)
比你想象的要简单得多。 or
关键字与||
相同,但优先级较低。有关详细信息,请参阅corresponding PHP page。
该语句的实际执行依赖于涉及逻辑运算符的单独概念:短路。这意味着,在or
的情况下,如果第一个语句结果为真,则不评估第二个语句。 (因为在条件中,例如,整个条件将返回true,而不需要看到后半部分。)
答案 2 :(得分:2)
当我学习PHP时,我记得在阅读'do or die'样式命令时并没有完全理解它们,经典的例子是:
mysql_connect() or die('couldn\'t connect');
请记住,条件只有在需要时才会运行,例如:
if (a == b && b == c)
此处b == c仅在a == b时进行测试。同样的理论适用于或:
if (a == b || b == c)
现在只有在!= b。
时才会测试b == c在这种情况下,您依靠此订单在某些条件下运行命令(exit或$ this-&gt; bar())。
要意识到...... 退出()在这种情况下是一个坏主意 - 如果你退出('出错了'),没有人可以做任何事情来隐藏用户的这个错误,它可能会发出200 OK HTTP状态,其中500内部服务器错误会更合适,我会考虑更像:
defined('foo') OR throw new Exception('foo is not defined!');
在这里,您有机会捕获异常或至少让PHP捕获它并发出500状态。
垫
答案 3 :(得分:1)
有时候你的功能看起来像是:
function test()
{
$foo = TRUE;
$bar = FALSE;
return $foo && $bar;
}
在这种情况下,如果有人这样做:
$bla = test();
if($bla) {
... do something
}
“......做某事”不会被执行,因为整个函数返回false。
返回$ foo&amp;&amp; $ bar表示两个变量必须为true才能使函数返回true。
另一方面,如果它声明:return $ foo || $酒吧;那么函数将返回true,因为至少有一个变量为真。