有趣的PHP语法:'暗示如果'?

时间:2011-02-03 01:47:39

标签: php zend-framework

我在Zend Framework项目的默认index.php文件中遇到了这个有趣的行:

defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

似乎在说“如果没有定义APPLICATION_PATH,那么继续并定义它......”

我不知道PHP中的这种控制结构。它几乎就像是“隐含的if”或“if / else”。任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:16)

它不是一个控制结构 - 它只是||的工作方式。如果第一个操作数被评估为true - 则第二个操作数根本没有被评估。

http://php.net/manual/en/language.operators.logical.php ---查看样本的前4行。

// --------------------
// foo() will never get called as those operators are short-circuit

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());

答案 1 :(得分:4)

||是一个短路运营商。如果左侧操作数为true,则整个表达式必须true,因此不会考虑评估右侧操作数。您可以以相反的方式使用&&;如果左侧操作数为false,则表达式整体必须为false,因此不会对右侧操作数进行求值。

这是用其他语言做事的相当惯用的方式。对于这种情况,我通常更喜欢PHP中的显式if

答案 2 :(得分:2)

从技术上讲,这只是一些被评估的布尔表达式,但会抛弃结果。它使用短路逻辑来确保后半部分仅在前半部分为假时运行。

同样,您可以捕获结果:

$foo = false || true;  // $foo will contain true.

答案 3 :(得分:2)

这是布尔表达式的short-circuiting evaluation,这确实是一种完成if-else之类的方法。