我很确定这个
之间没有区别if ($value === true)
和这个
if (true === $value)
对我而言似乎总是令人困惑。我曾经认为这是'非常规的新开发者风格。此外,我的老板告诉我永远不要做这样的事情。
但今天我查看Slim的源代码,由创建PHP: The Right Way的人编写,并看到this (第341行)。
if (true === $value) {
$c['settings'] = array_merge_recursive($c['settings'], $name);
}
我敢肯定像Josh Lockhart这样的人如果被认为是一种不好的做法就不会做这样的事情。这个订单怎么样?这是一种古老的传统吗?
答案 0 :(得分:6)
这通俗地称为'Yoda Conditions'。他们使用背后的原因是因为有时人们会犯错误。在if
语句的上下文中,有时会出现这样一个错误:
if($value = 42)
请注意,没有双等号(==
)。这是一个有效的语句,不是语法错误。它可能会导致跟随它的代码造成巨大的中断,并且很难快速识别。尤达条件通过反转条件表达式来解决这个问题:
if(42 = $value)
这是不一个有效的语句,并且是语法错误,通常会报告包含行号,因此它们很容易找到。
"您遇到语法错误。第73行做你必须做的其他事情。" - 尤达的编译器,可能是
你是否真的认为他们的好坏取决于个人偏好和风格。在一些流行框架(例如Wordpress)的情况下,Yoda条件实际上是官方编码标准的一部分。对他们的主要批评是,对某些人来说,他们会降低代码的可读性,而不会带来任何实际的主要好处。
正如@MonkeyZeus在对该问题的评论中指出的那样,有时候人们确实意味着只在if
条件中使用单个等号:
if($iMustHaveAValue = functionCallThatCanFail()) {
// Rest assured, $iMustHaveAValue has a truthy value.
}
从the value of an assignment operation is the value assigned开始,在这种情况下由if
条件评估的值(以及在原始情况下是非预期的)是发生的任何值。