嘿伙计:)需要帮助。 我目前正在研究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'));
}
我之前从未遇到过这种简写语法......
答案 0 :(得分:5)
||
是一个短路运算符,这意味着第二个操作数,在这种情况下define(...)
仅在第一个操作数求值为false的情况下进行求值。因为衬衫电路操作员的操作数实际上可能会产生副作用,所以短路可能会替代if
声明。
答案 1 :(得分:2)
功能上,是的,它是一样的。 defined
函数返回一个布尔值,因此它使用短路评估来表示“要么已定义,要么执行此定义。”
答案 2 :(得分:2)
是。但是,它基于the way PHP implements boolean evaluation,不应被视为惯用的构造。它几乎肯定会在未来的PHP版本中运行,但我仍然会阻止这种语法,因为它缺乏表现力。
以下是有关此语法原理的简短说明:
PHP中的布尔表达式具有以下形式:
left_expression BOOLEAN_OPERATOR right_expression;
其中BOOLEAN_OPERATOR
是logical 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'))
。
所以无论何时,
答案 3 :(得分:0)
称为短路。 OR(||
)仅在第一部分为假时才评估第二部分。同样,如果第一部分为真,则AND(&&
)可用于仅评估第二部分。
答案 4 :(得分:0)
是。 PHP是懒惰的,如果有逻辑或语句,它将在第一次评估为true后停止。
答案 5 :(得分:0)
你的想法是正确的。 PHP中大多数命令式语句都返回可用于短路的布尔值。即使那些返回void(相当于null / false)也可以以相同的方式使用。
答案 6 :(得分:0)
是。请记住,“或”运算符||
被评估为“懒惰” - 如果第一部分评估为“TRUE”,则第二部分不会运行,因为它的结果对整个语句没有影响。同样的事情也适用于&& - 如果第一部分为FALSE,则第二部分不会运行。