可能的重复:
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&$bar表示两个变量都必须为true,函数才能返回true。
另一方面,如果它声明:return$foo||$bar;那么函数将返回true,因为至少有一个变量为true。