2011-07-25 63 views
1

我注意到这一段代码使用笨数据库迁移:这句法正确吗?

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

$verbose是一个配置值。

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

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

你觉得呢?

+0

我会避免这种情况,因为在很多语言中,不能保证AND将从左到右进行评估。所以即使它在这里完全正常工作,它的逻辑并不普遍。 – Luke

+0

@Luke,在我知道的大多数语言中都有这样的保证,而且PHP绝对是其中的一种:) – Paulpro

+0

我知道,很明显,这在PHP中是真实的,但在概念上并不带有这种保证。 – Luke

回答

2

这就是所谓的“短路求”,并且该技术在shell脚本中经常使用的 - 例如:

rm thing_to_delete || exit 1 

它在某些语言比其他人更常见,很多人都看它是应该避免的事情,因为它可能会令人困惑。 (人们通常认为逻辑表达式没有副作用)。

0

逻辑运算符是短路和评估操作数由左到右,所以这个代码正是什么版本if声明。

这是一个完全有效的代码,如果你有好的开发商应该也读他们所有人。如果它在团队中造成混乱,那就不要使用它,但是最好教他们实际上做了什么。

1

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

1

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

1

“这在语法上是正确的吗?”

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

1

所以,虽然这两个片段有同样的效果,我强烈第二(if (…) print ...)投票。代码是关于与其他程序员进行沟通的信息。如果语言的习语(以及程序员使用它)在这种情况下使用短路评估,那么它可能会很好。但是,PHP通常不会在语句中使用短路评估 - 大多数PHP程序员(实际上,一般程序员)都会在这里采取双重措施。

代码至少惊喜,代码的确切含​​义。如果这是一个条件测试,只有在某些变量为真的情况下才应该执行,那么使用条件测试构造将其作为一个真实的条件测试 - 也就是在这里,if

0

如果可读性代码的肖像,以什么样的代码实际上做的,然后使用if更具有可读性的自然语言描述。