【问题标题】:Is this syntactically correct?这在语法上正确吗?
【发布时间】:2011-07-25 15:46:44
【问题描述】:

我在使用 CodeIgniter 数据库迁移时注意到了这段代码:

$this->migrations->verbose AND print "Creating table '{$table}'...";

$verbose 是一个配置值。

我们在办公室就这是否是有效且可读的代码进行了辩论。如果第一部分为真,它基本上取代了对 IF 语句的需求,因为它执行条件的第二部分。我其实很喜欢它,但办公室里的人认为它的工作是一个意外,而且这将更具可读性:

if( $this->migrations->verbose ) print "Creating table '{$table}'...";

你怎么看?

【问题讨论】:

  • 我会避免这种情况,因为在许多语言中,不能保证 AND 会从左到右进行评估。所以即使它在这里工作得很好,它的逻辑也不是通用的。
  • @Luke,在我知道的大多数语言中,都可以保证这一点,而且 PHP 肯定是其中之一:)
  • 我知道,很明显这在 PHP 中是正确的,但从概念上来说,AND 并不能保证。
  • 感谢所有 cmets 人。自从我发帖以来,我实际上已经在 CodeIgniter 库的其他地方看到了它——我可能会坚持使用后者,因为老板是这么说的:)

标签: php codeigniter if-statement conditional


【解决方案1】:

这称为“短路评估”,该技术经常在 shell 脚本中使用 - 例如:

rm thing_to_delete || exit 1

它在某些语言中比其他语言更常见,而且很多人确实认为它是应该避免的,因为它可能会造成混淆。 (人们通常认为逻辑表达式没有副作用。)

【讨论】:

    【解决方案2】:

    它是有效的,但它肯定是不可读的。我不认为尝试将 Perl 风格的语法结构引入 PHP,即使它们确实有效,也是一个好主意。

    【讨论】:

      【解决方案3】:

      绝对有效。它是否可读纯粹是主观的。 :)

      【讨论】:

        【解决方案4】:

        “这在语法上正确吗?”

        当然是 :) 否则 PHP 会给你一个解析错误。该代码有效,并且在语义上也是正确的 PHP。这很像使用:$v = $v || "default value"; 为$v 分配一个默认值(如果还没有)。

        【讨论】:

          【解决方案5】:

          因此,虽然两个 sn-ps 具有相同的效果,但我强烈支持第二个 (if (…) print ...)。代码是关于与其他程序员交流的,就像它与机器交流一样。如果该语言的习语(以及因此使用它的程序员)在这种情况下使用短路评估,那么它可能会很好。然而,PHP 通常不会在语句中使用短路求值 - 大多数 PHP 程序员(实际上是一般程序员)都会在这里做双重考虑。

          编码以减少意外,并编码您的确切含义。如果这是一个仅在某个变量为真时才应执行的条件测试,请使用条件测试构造使其成为真正的条件测试 - 即此处为 if。

          【讨论】:

            【解决方案6】:

            逻辑运算符是从左到右的短路和求值操作数,因此此代码完全与if 语句的版本相同。

            这是一个完全有效的代码,如果你有优秀的开发人员,它应该对所有人都可读。如果它在团队中引起混乱,请不要使用它,但最好教他们它的实际作用。

            【讨论】:

              【解决方案7】:

              如果可读性是代码与自然语言描述代码实际行为的相似之处,那么使用if 更具可读性。

              【讨论】:

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