这个PHP语法是否正确?

时间:2010-11-10 20:07:36

标签: php syntax shorthand

嘿伙计:)需要帮助。 我目前正在研究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'));
}

我之前从未遇到过这种简写语法......

7 个答案:

答案 0 :(得分:5)

||是一个短路运算符,这意味着第二个操作数,在这种情况下define(...)仅在第一个操作数求值为false的情况下进行求值。因为衬衫电路操作员的操作数实际上可能会产生副作用,所以短路可能会替代if声明。

查看此文章:http://en.wikipedia.org/wiki/Short-circuit_evaluation

答案 1 :(得分:2)

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

答案 2 :(得分:2)

是。但是,它基于the way PHP implements boolean evaluation,不应被视为惯用的构造。它几乎肯定会在未来的PHP版本中运行,但我仍然会阻止这种语法,因为它缺乏表现力。

以下是有关此语法原理的简短说明:

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

left_expression BOOLEAN_OPERATOR right_expression;

其中BOOLEAN_OPERATORlogical operator,例如||

由于OR表达式的一个操作数求值为true时,OR表达式的值为true,因此PHP解释器一旦找到求值为true的操作数就可以停止计算。

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

所以无论何时,

  • 左表达式的计算结果为false,右计算结果。
  • 左表达式的计算结果为true,不评估右侧。

答案 3 :(得分:0)

称为短路。 OR(||)仅在第一部分为假时才评估第二部分。同样,如果第一部分为真,则AND(&&)可用于仅评估第二部分。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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