这个PHP语法正确吗?

这个PHP语法正确吗?,php,syntax,shorthand,Php,Syntax,Shorthand,我目前正在学习ZEND framework,在index.php中遇到了以下问题: // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 这个和这个一样吗 if(!defined('APPLICATION_PATH')){ define('

我目前正在学习ZEND framework,在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'));
}

我以前从未遇到过这种速记语法。

它被称为短路。或者(
|
)仅在第一部分为false时计算第二部分。类似地,如果第一部分为真,则AND(
&&&
)只能用于计算第二部分。

是。PHP是懒惰的,如果有一个逻辑or语句,它将在第一个求值为true后停止。

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

从功能上讲,是的,它是相同的。
defined
函数返回一个布尔值,因此它使用短路求值来表示“要么定义了,要么执行这个定义。”

|
是一个短路运算符,这意味着第二个操作数(在本例中为
define(…)
仅在第一个操作数求值为false时求值。因为与您的情况一样,电路运算符的操作数实际上可能有副作用,所以短路可能会替代
if
语句


检查这篇文章:

是。请记住,“or”操作符
|
是“延迟”求值的-如果第一部分求值为“TRUE”,则第二部分不会运行,因为它的结果对整个语句没有影响。&&-如果第一部分为FALSE,则第二部分将不会运行。

是。然而,它是基于并且不应该被认为是一个惯用的构造。它几乎肯定会在PHP的未来版本中工作,但我仍然不鼓励使用这种语法,因为它缺乏表达能力

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

PHP中的布尔表达式的形式如下:

左\u表达式布尔\u运算符右\u表达式

其中,
布尔_运算符
是一个,例如,
|

由于或表达式的一个操作数的计算结果为
true
,它们的计算结果即为true,因此PHP解释器可以在找到一个计算结果为
true
的操作数后立即停止计算

在这种情况下,如果
defined('APPLICATION\u PATH')
的计算结果为true,则将不计算
define('APPLICATION\u PATH',realpath(dirname('uuu FILE.'/../APPLICATION'))
。如果
defined('APPLICATION\u PATH')
的计算结果为false,则PHP需要计算
define('APPLICATION\u PATH',realpath(dirname('uuuu FILE.'/../APPLICATION'))

所以无论什么时候,

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

这是我第一次看到这种语法。我想你的意思是“如果第一个操作数是
false
”。否则,它将是
&&
而不是
|
@Andre:欢迎来到stackoverflow!很快得到很多答案并不罕见,因为我们这里的所有人都在争夺声誉:-)我不同意这样一个成语缺乏表达力。正是这种习惯用法使Perl成为如此灵活和富有表现力的语言。