这在语法上是否正确?

时间:2011-07-25 15:46:44

标签: php codeigniter if-statement conditional

我在使用CodeIgniter数据库迁移时发现了这段代码:

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

$verbose是配置值。

我们在办公室辩论过这是否是有效且可读的代码。它基本上取代了对IF语句的需要,因为如果第一部分为真,它执行条件的第二部分。我其实非常喜欢它,但办公室里的人认为这是一个意外,它的工作原理会更加可读:

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

您怎么看?

7 个答案:

答案 0 :(得分:2)

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

rm thing_to_delete || exit 1

在某些语言中,这种语言比其他语言更常见,很多人确实将其视为可以避免的东西,因为它可能令人困惑。 (人们通常认为逻辑表达式没有副作用。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

“这在句法上是否正确?”

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

答案 4 :(得分:1)

因此,虽然这两个片段具有相同的效果,但我会对第二个(if (…) print ...)进行强烈投票。代码是关于与其他程序员进行通信,就像与机器进行通信一样。如果语言的成语(以及使用它的程序员)对这种情况使用短路评估,那么它可能会很好。但是,PHP通常不会在语句中使用短路评估 - 大多数PHP程序员(实际上是程序员)会在这里进行双重考虑。

代码最少惊喜,并编码您的确切含义。如果这是一个条件测试,只有当某个变量为true时才应该执行,那么使用条件测试构造(即此处if)使其成为一个真正的条件测试。

答案 5 :(得分:0)

逻辑运算符是从左到右的短路和评估操作数,因此这段代码与<{1}}语句完全相同

这是一个完全有效的代码,如果你有优秀的开发人员,它应该对所有人都可读。如果它导致团队混乱,那么不要使用它,但最好教他们实际做什么。

答案 6 :(得分:0)

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