5

我目前正在研究 ZEND 框架,并在 index.php 中遇到了这个:

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

这和这个一样吗?

if(!defined('APPLICATION_PATH')){
    define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
}

我以前从未遇到过这种速记语法。

4

7 回答 7

5

||是一个短路运算符,这意味着第二个操作数,在这种情况下define(...),仅在第一个操作数评估为假的情况下才被评估。因为衬衫电路运算符的操作数实际上可能像您的情况一样具有副作用,所以短路可能会替代if语句。

检查这篇文章:http ://en.wikipedia.org/wiki/Short-circuit_evaluation

于 2010-11-10T20:12:39.647 回答
2

从功能上讲,是的,它是相同的。该defined函数返回一个布尔值,因此它使用短路评估来表示“要么定义这个,要么执行这个定义。”

于 2010-11-10T20:11:52.967 回答
2

是的。但是,它基于PHP 实现布尔求值的方式,不应被视为惯用构造。它几乎肯定会在 PHP 的未来版本中工作,但我仍然不鼓励这种语法,因为它缺乏表现力。

以下是有关此语法为何有效的简短说明:

PHP 中的布尔表达式具有以下形式:

left_expression BOOLEAN_OPERATOR right_expression;

例如,其中BOOLEAN_OPERATOR是一个逻辑运算符||

由于 OR 表达式在其操作数之一的计算结果为 时立即计算为真true,因此 PHP 解释器可以在找到计算结果为 的操作数时立即停止计算true

在这种情况下,如果defined('APPLICATION_PATH')评估为真,define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'))则不会被评估。如果defined('APPLICATION_PATH')评估为 false,PHP 需要评估define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')).

所以无论何时,

  • 左边的表达式计算为假,右边的被计算。
  • 左边的表达式计算为真,右边不计算。
于 2010-11-10T20:23:19.700 回答
0

它被称为短路。如果第一部分为假, OR ( ||) 只会评估第二部分。类似地,如果第一部分为真,AND ( &&) 只能用于评估第二部分。

于 2010-11-10T20:10:44.077 回答
0

是的。PHP 是惰性的,如果有逻辑或语句,它将在第一个评估为 true 后停止。

于 2010-11-10T20:10:58.023 回答
0

你的想法是对的。PHP 中的大多数命令式语句都返回可用于短路的布尔值。甚至那些返回 void(相当于 null/false)的也可以以相同的方式使用。

于 2010-11-10T20:11:12.757 回答
0

是的。请记住,“或”运算符||被评估为“懒惰” - 如果第一部分评估为“TRUE”,则第二部分不会运行,因为它的结果对整个语句没有影响。&& 也是如此——如果第一部分为 FALSE,则第二部分将不会运行。

于 2010-11-10T20:12:40.680 回答