【问题标题】:Is this PHP syntax correct?这个 PHP 语法正确吗?
【发布时间】:2011-05-08 02:35:56
【问题描述】:

我目前正在研究 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'));
}

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

【问题讨论】:

  • 这是我第一次看到这种语法。

标签: php syntax shorthand


【解决方案1】:

是的。但是,它基于the way PHP implements boolean evaluation,不应被视为惯用构造。它几乎肯定会在 PHP 的未来版本中工作,但我仍然不鼓励这种语法,因为它缺乏表现力。

以下是有关此语法为何有效的简短说明:

PHP 中的布尔表达式具有以下形式:

left_expression BOOLEAN_OPERATOR right_expression;

其中BOOLEAN_OPERATORlogical operator,例如||

由于 OR 表达式在其操作数之一的计算结果为 true 时立即计算为真,因此 PHP 解释器可以在找到计算结果为 true 的操作数时立即停止计算。

在这种情况下,如果 defined('APPLICATION_PATH') 的计算结果为 true,则不会计算 define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'))。如果defined('APPLICATION_PATH') 评估为假,PHP 需要评估define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'))

所以无论何时,

  • 左边的表达式计算为假,右边的表达式计算。
  • 左边的表达式计算为真,右边没有计算。

【讨论】:

  • 我不能同意这样的成语缺乏表现力。正是这种习语使 Perl 成为一种灵活而富有表现力的语言。
【解决方案2】:

是的。请记住,“或”运算符|| 被评估为“懒惰” - 如果第一部分评估为“TRUE”,则第二部分不会运行,因为它的结果对整个语句没有影响。 && 也是如此——如果第一部分为 FALSE,则第二部分不会运行。

【讨论】:

    【解决方案3】:

    || 是一个短路运算符,这意味着第二个操作数,在这种情况下 define(...) 仅在第一个操作数计算结果为假的情况下计算。因为衬衫电路运算符的操作数实际上可能像您的情况一样具有副作用,所以短路可能会替代 if 语句。

    查看这篇文章:http://en.wikipedia.org/wiki/Short-circuit_evaluation

    【讨论】:

    • 我想你的意思是“如果第一个操作数是false”。否则,它将是 && 而不是 ||
    • @Andre:欢迎来到 stackoverflow!很快得到很多答案并不罕见,因为我们这里的所有人都在争夺声誉:-)
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        是的。 PHP 是惰性的,如果有逻辑或语句,它将在第一个评估为 true 后停止。

        【讨论】:

          【解决方案7】:

          这叫做短路。 OR (||) 只会在第一部分为假时评估第二部分。同样,AND (&&) 可用于仅在第一部分为真时评估第二部分。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-09-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-25
            相关资源
            最近更新 更多