我在使用CodeIgniter数据库迁移时发现了这段代码:
$this->migrations->verbose AND print "Creating table '{$table}'...";
$verbose
是配置值。
我们在办公室辩论过这是否是有效且可读的代码。它基本上取代了对IF语句的需要,因为如果第一部分为真,它执行条件的第二部分。我其实非常喜欢它,但办公室里的人认为这是一个意外,它的工作原理会更加可读:
if( $this->migrations->verbose ) print "Creating table '{$table}'...";
您怎么看?
答案 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
更具可读性。