if('constant'== $ variable)与if($ variable =='constant')


48

最近,我已经在PHP中进行了大量工作,尤其是在WordPress框架中。我注意到许多形式的代码:

if ( 1 == $options['postlink'] )

我本来希望看到的地方:

if ( $options['postlink'] == 1 )

这是某些语言/框架中的约定吗?是否有任何理由使前一种方法比后者更好(从处理角度,解析角度甚至人的角度来看)?

还是仅仅是口味问题?我一直认为执行测试时会更好,因为针对某个常量测试的变量项位于左侧。似乎更好地映射了我们用自然语言提出问题的方式:“如果蛋糕是巧克力”而不是“如果巧克力是蛋糕”。


1
我从来没有写过这样的代码,但是要公平地说,“如果巧克力是蛋糕的味道”,听起来自然。自然语言更加灵活。
里克·斯拉基

4
@Rick在语言上听起来很自然,但是您不能否认,当您看到这样的代码时,您必须首先停止(也许只停留一秒钟),以思考它试图做什么。
埃德加·冈萨雷斯

4
@Edgar Gonzalez:同意,我在代码中坚决反对。
里克·斯拉基

3
实际上,Code Complete 2nd Edition的第19章(在“布尔表达式:布尔表达式的常见问题”部分下)实际上推荐了这种做法,其确切原因在此处的许多答案中都有提及:在进行比较时,防止使用C衍生语言进行赋值。
CraigTP

4
我经常看到这些被称为“ Yoda条件”
Brian

Answers:


83

这样做的主要原因(所谓的“有田条件”)是为了防止意外发生,因为您不小心使用了赋值运算符(=)而不是相等的比较运算符(==)。

也就是说,如果您犯了以下错误:

$foo = 5;
if ($foo = 1) {
  // Stuff
}

该语句的计算结果为true(或在某些语言(如PHP)中为真实值),您将遇到一个难以发现的错误。

但是,如果您这样做:

$foo = 5;
if (1 = $foo) {
  // Stuff
}

您将收到致命错误,因为您无法分配$foo给整数。

但是正如您所指出的,颠倒顺序通常会使事情变得不那么可读。因此,尽管有了Bug搜寻的好处,但许多编码标准(但不是全部,包括WordPress)都建议或要求。$foo == 11 == $foo

通常,我的建议是遵循任何已建立的编码标准,如果有的话:对于WordPress,这意味着使用Yoda条件。

如果没有,并且不可能与您的同行达成共识,那就是经销商的选择。


2
我记得在设计一种语言时(很久以前),我们专门使它:=成为赋值运算符(==用于相等性测试),以避免这种麻烦。
Donal Fellows,

7
我已经写了很多行代码,而且我从来没有不小心键入=而不是==。到处都在强调这种差异,以至于我从未让他们感到困惑。另一方面,我阅读了许多令人困惑或难以理解的代码。因此,我将优先考虑可读性:)。无论如何,好的答案。
crazy2be 2011年

5
还有另一个使用的理由-Wall -Werror或您的编译器/解释器的等效对象。在极少数情况下,条件内的分配是正确的,更不用说更具可读性了。许多语言甚至不允许这样做。
卡尔·比勒费尔特

7
Pedantic:虽然在某些语言中if($foo = 1)评估为true,但在PHP中评估为1;if($foo = 20)评估为20;if($foo = 0)计算结果为0,与其他值不同的是假。这会给错误增加整个“另一层”复杂度。
查尔斯

2
实际上,WordPress编码标准确实要求Yoda条件:codex.wordpress.org/WordPress_Coding_Standards#Yoda_Conditions
Tom Auger

13

这是一种防御性的编码机制,旨在防止意外使用赋值运算符。

考虑分配运算符的误用/错误,而不是相等运算符

if ( $options['postlink'] = 1  )

上面的条件将始终返回true,但这可能不是原始程序员所想到的。考虑到这里

if( 1 = $options['postlink'])

在这里,PHP(和大多数其他语言)将拒绝运行,因为无法将任何值分配给的固定值1。通过以这种方式编码所有条件语句,您可以自动确保在条件条件中不会意外使用赋值运算符。


9

我喜欢在Java中使用该约定来消除出现空指针异常的可能性。因此,这样的事情不会给您带来任何问题或需要任何额外的代码:

String foo = null;

if ("bar".equals(foo))
{
    //Do something
}

3
我喜欢这个,但是我讨厌这个成语。
Thomas Eding

3
如果空值到那时在代码中无效,则您应该已经对其进行了检查,或者以某种方式设计代码以使空值不可能。
Ed S.

6
这似乎是掩盖问题的简便方法。灰尘不能通过将其耸在地毯上来清洁。
Lie Ryan

0

实际上,如果您编写“ if(x = 1)”而不是“ if(x == 1)”,许多编译器会警告您,因为这很可能是错误的。

使用Clang,可以通过有效地告诉编译器“我是认真的,我知道我在做什么”来避免警告,而这可以通过编写“ if((x = 1))”来完成。注意多余的括号。在其他情况下也是如此。if(false)陈述;可能会警告您该语句永远不会执行;if((false))语句;不会发出警告。


我非常喜欢那个!我避免在PHP中使用以下完全合法的习惯用法,因为我总是在IDE中收到警告:if ($array = getSomething()){ // ..so something with $array }
Tom Auger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.