为什么有些人在if语句中将值放在变量之前?

Cha*_*han 12 php comparison if-statement

例如,与$ variable === true有什么不同?

<?php

if (true === $variable) {
     //
}

if (1 === intval($variable)) {
    //
}
Run Code Online (Sandbox Code Playgroud)

rua*_*akh 14

它们是等价的.

一些程序员更喜欢这种"Yoda风格",以避免意外写入的风险:

if ($variable = true) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

,相当于

$variable = true;
// ...
Run Code Online (Sandbox Code Playgroud)

,当他们打算写

if ($variable === true) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

(但if (true = $variable)会产生明显的错误而不是潜在的微妙错误).

  • @cHao:OP 举了两个例子。`true === $variable` 就是我说的原因。`1 === intval($variable)` 是为了一致性:如果你有某种模式在某些情况下更安全,那么你应该在所有情况下都坚持使用它,否则即使你需要它也会错过它. (也就是说,我觉得尤达风格太丑了。有更好的方法来实现这个目标。) (2认同)

Sve*_*sen 8

简短的回答

有些人这样做是为了避免=在真正意图使用比较运算符(==或===)时错误地使用赋值运算符().

答案很长

在PHP中有3个运算符可以被误认为是彼此:

  • = 是赋值运算符
  • == 是"等于"运算符
  • === 是"相同的"运营商

第一个运算符仅用于为变量赋值.第二个和第三个仅用于比较两个值或表达式.

在PHP有可能的值分配给变量内部控制结构(if,for,while等等).如果你不小心,这可能会导致问题.例如,如果要与$a布尔值进行比较,可以这样做:

if ($a == false) // or
if ($a === false)
Run Code Online (Sandbox Code Playgroud)

但是,如果你不小心,它可能最终会像这样:

if ($a = false)
Run Code Online (Sandbox Code Playgroud)

...这是完全合法的代码,但它是一项任务,最终会导致问题.它会导致问题的原因是因为表达式$a=false将被评估并且代码将继续运行,就像没有任何错误一样,而事实上它并非意图.

之所以有些人围绕操作数切换,比较对文字的值时(固定值,如true,false,7,5.2,等),是因为它是不可能的值赋给一个文字.例如:

if (false = $a)
Run Code Online (Sandbox Code Playgroud)

...会导致错误,告诉程序员他们犯了错误,然后他们可以修复.