在PHP中定义或定义

在PHP中定义或定义,php,Php,可能重复: 这段代码是由Zend Framework提供的zf工具创建的 defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 我的问题是: 这行代码的目的是什么?没有条件语句,例如if、switch。它是否自动暗示条件语句 以下是我的理解: 如果定义了应用程序路径,请不要使用它,否则将其设置为:realpath(dirname(\

可能重复:

这段代码是由Zend Framework提供的zf工具创建的

defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
我的问题是: 这行代码的目的是什么?没有条件语句,例如if、switch。它是否自动暗示条件语句

以下是我的理解: 如果定义了应用程序路径,请不要使用它,否则将其设置为:
realpath(dirname(\uu文件).'/../APPLICATION')

如果我的假设是真的,这是一个非常混乱的语法

任何帮助都将不胜感激。

等于

if ( !defined('APPLICATION_PATH') )
    define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));
你的假设是对的,
这段代码乱七八糟。

|
是PHP的
操作符

如果未定义
应用程序路径
,则该行将定义它。

类似于

  if (!defined('APPLICATION_PATH')) define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));
或者,用人类的语言

  defined('APPLICATION_PATH') or define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));

这是一个三元/内联条件语句。如果
defined
函数返回false,它将
define
应用程序路径。

是,这是一个较长的快捷方式(称为):

if (!defined('APPLICATION_PATH')) {
    define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));
}
<>这个原因是中间代码中<代码> > <代码>的方式。

|
是OR运算符,如果除此之外的任何一个值为TRUE,则返回TRUE。如果第一个值为TRUE,那么它不需要检查第二个值,因此它不会。因此,如果
defined('APPLICATION\u PATH')
为TRUE,那么
define('APPLICATION\u PATH',realpath(dirname('u FILE.'/../APPLICATION'))
将永远不会运行

在这种情况下,语句返回的值被简单地丢弃(它不在另一个语句中使用,也不存储在变量中),但运算符的工作方式仍然使该技术起作用

我不特别推荐在代码中使用它,因为它会降低代码的可读性。但是,它是一种相当普遍的快捷方式,因此大多数程序员在看到它时都会识别它。

此代码用于计算表达式——如果第一个参数不为真,则仅在or运算符(the
|
)之后执行内容。短路是在这样一种假设下工作的,即由于表达式中只有一个值需要为真,或者整个表达式都需要为真,因此如果第一个参数为真,则可以停止执行,从而阻止执行运算符的第二个参数

那么代码呢

defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'));
将检查是否定义了
应用程序路径
。如果是,则
|
必须为真,并且没有理由检查第二个参数是否为真,因为它不会影响布尔运算的最终结果

如果未定义
应用程序路径
,则
|
必须计算第二个参数(在本例中,定义
应用程序路径
),以确定
|
操作的结果

因此,它实际上与

if (!defined('APPLICATION_PATH'))
{
     define('APPLICATION_PATH', realpath(dirname(_FILE_) . '/../application'))
}
您还经常会看到使用
&&
运算符进行短路评估。这方面的一个例子是许多语言中使用的一个常见习惯用法,即首先在
&&
表达式中检查NULL,从而在if语句中检查NULL:

if ( something != NULL && something->SomeCondition())
{  
  //...
}

这与短路评估相反。对于
&&
而言,如果第一个参数为false,则计算将停止,因为所有内容都必须为true才能通过
&&
。因此,在上面的代码中,
something->SomeCondition()
如果某个值为NULL,则不会导致任何类型的崩溃——它不会被执行,因为某个值!=NULL为false,表达式的执行在该点终止。

您的假设是正确的。这只是一个简单的说法

if (!defined('APPLICATION_PATH')) {
  define('APPLICATION_PATH', '...');
}
您可以轻松测试这一点:

define("foo", "bar");
defined("foo") || define("foo", "baz");
var_dump(foo);
输出为

//define("foo", "bar");
defined("foo") || define("foo", "baz");
var_dump(foo);

输出是
baz

Hmm。。。我见过更糟的。尽管如此,我还是同意读起来不是很好,如果(!defined(…)
的话,
会更好。这段代码太乱了。你说。短路评估并不混乱,但它可能会混淆,就像它在OP中所做的那样。我想我找到了答案:这就是所谓的“短路评估”。如果左侧返回
TRUE
,则不需要计算右侧,并跳过右侧。如果
|
的左侧为
FALSE
,则右侧将被计算/执行。@winteck+1用于查找您自己的问题的dup。最优雅的方式是:
定义('MYCONST')或定义('MYCONST',42)
您的If上缺少了一个右括号