在PHP中定义或定义

时间:2011-10-11 17:12:52

标签: php

  

可能重复:
  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')

如果我的假设是真的,这是一个非常令人困惑的语法。

任何帮助将不胜感激。

8 个答案:

答案 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,则此行将定义它。