可能重复:
Why 'defined() || define()' syntax in defining a constant
这段代码是由Zend Framework提供的zf工具创建的。
defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
我的问题是: 这行代码的目的是什么?没有条件语句,例如if,switch。它是否自动暗示条件语句?
以下是我的理解:
如果定义了APPLICATION_PATH,则不管它还是将其设置为:realpath(dirname(__FILE__) . '/../application')
。
如果我的假设是真的,这是一个非常令人困惑的语法。
任何帮助将不胜感激。
答案 0 :(得分:12)
你的假设是正确的。这只是一个简单的说法
if (!defined('APPLICATION_PATH')) {
define('APPLICATION_PATH', '...');
}
您可以轻松测试:
define("foo", "bar");
defined("foo") || define("foo", "baz");
var_dump(foo);
输出为bar
。
//define("foo", "bar");
defined("foo") || define("foo", "baz");
var_dump(foo);
输出为baz
。
答案 1 :(得分:8)
此代码使用short circuiting来计算表达式 - 如果第一个参数不成立,则仅执行或运算符(||
)之后的内容。短路工作的假设是,由于表达式中只有一个值需要为真,或者整个事件都是真的,如果第一个参数为真,则执行可以停止 - 防止执行操作符的第二个参数。
所以代码
defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));
将检查是否定义了APPLICATION_PATH
。如果是,那么||
必须为真,并且没有理由检查第二个参数是真还是假,因为它不会影响布尔运算的最终结果。
如果未定义APPLICATION_PATH
,则||
必须评估第二个参数(在本例中定义APPLICATION_PATH
)以确定||
的结果操作
因此它与
实际上有效if (!defined('APPLICATION_PATH'))
{
define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'))
}
您还经常会看到&&
运算符进行短路评估。这方面的一个例子是在许多语言中使用的常见习惯是通过在&&
表达式中首先检查NULL来对if语句进行NULL检查:
if ( something != NULL && something->SomeCondition())
{
//...
}
这与||
短路评估相反。如果第一个参数为false,则&&
评估停止,因为&&
传递的所有内容都必须为true。所以在上面的代码中,如果某些东西是NULL,something->SomeCondition()
将不会导致任何类型的崩溃 - 它将不会被执行,因为某些东西!= NULL是假的,并且表达式的执行在那时终止。
答案 2 :(得分:5)
是的,这是一个更长的快捷方式(称为short-circuit evaluation):
if (!defined('APPLICATION_PATH')) {
define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));
}
这是有效的原因是中间||
的工作方式。
||
是OR运算符,如果除此之外的任何值都是 TRUE ,它将返回 TRUE 。如果第一个值是 TRUE ,那么它不需要检查第二个值,所以它不会。因此,如果defined('APPLICATION_PATH')
TRUE ,那么define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'))
将永远无法运行。
在这种情况下,语句返回的值只是被丢弃(它不会在另一个语句中使用或存储在变量中),但运算符的工作方式仍然可以使这种技术有效。
我不特别建议在代码中使用它,因为它会降低代码的可读性。但是,它是一种相当普遍的快捷方式,因此大多数程序员在看到它时都会认出它。
答案 3 :(得分:2)
就像
if (!defined('APPLICATION_PATH')) define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));
或者,用人类的语言
defined('APPLICATION_PATH') or define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));
答案 4 :(得分:1)
这是一个三元/内联条件语句。如果defined
函数返回false,它将define
APPLICATION_PATH。
答案 5 :(得分:0)
等于
if ( !defined('APPLICATION_PATH') )
define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));
答案 6 :(得分:0)
你的假设是对的, 这段代码很乱。
答案 7 :(得分:0)
||
是PHP的OR
运算符。
如果未定义APPLICATION_PATH
,则此行将定义它。