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

Php 为什么有些人在if语句中将值放在变量之前?,php,if-statement,comparison,Php,If Statement,Comparison,例如,与$variable===true有什么不同 <?php if (true === $variable) { // } if (1 === intval($variable)) { // } 它们是等效的 一些程序员更喜欢这种“尤达风格”,以避免意外编写的风险: if ($variable = true) { // ... } ,相当于 $variable = true; // ... ,当他们打算写作的时候 if ($variable === t

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

<?php

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

if (1 === intval($variable)) {
    //
}
它们是等效的

一些程序员更喜欢这种“尤达风格”,以避免意外编写的风险:

if ($variable = true) {
    // ...
}
,相当于

$variable = true;
// ...
,当他们打算写作的时候

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

(而
if(true=$variable)
会产生明显的错误,而不是潜在的细微错误)。

($var==true)
(true==var)
之间没有区别。它们是等价的


有关完整的比较表,请参阅。你会发现所有等价的比较都有相同的结果。

我想这只是一般的思维方式。当你真正思考一个深刻的if语句时,你会思考该语句是否正确,而不是另一种观点。这没有错,但在我的脑海里,把它命名为反面,会让我恼火,让我无法集中注意力。所以我想说这正是人们思考的方式:D.

简短回答

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

长答案

在PHP中,有3个运算符可能相互误认:

  • =
    是赋值运算符
  • =
    是“等于”运算符
  • =
    是“等同于”运算符
第一个运算符仅用于为变量赋值。第二个和第三个仅用于相互比较两个值或表达式

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

if ($a == false) // or
if ($a === false)
if ($a = false)
但是,如果您不小心,结果可能是这样的:

if ($a == false) // or
if ($a === false)
if ($a = false)
。。。这是完美的法律规范,但这是一项转让,最终会造成问题。它会导致问题的原因是表达式“
$a=false”
”将被求值,并且代码将继续运行,就像没有任何错误一样,而实际上它并不是故意的

有些人在将值与文字(固定值,如
true
false
7
5.2
,等等)进行比较时切换操作数的原因是无法为文字赋值。例如:

if (false = $a)

。。。将导致一个错误,告诉程序员他们犯了一个错误,然后可以修复。

此外,有些人更喜欢在语句之前查看计算的结果。 有些语句可能更长,更难阅读

例:

因此,最好思考“这个复杂的表达是错误的吗?”而不是思考
“这个更复杂的表达是……嗯……错了?”

因为他们看到有人这样做过一次,他们不知道如何独立思考。不要这样做。这是“错误的做法”。关于为了安全而这样做的答案是正确的,但我知道也有人这样做只是因为它更难阅读。我通常会发现这些类型的“if”语句在不必要的代码中很难读懂。无论如何,现在这是一个没有意义的问题,因为大多数好的IDE都会在“if”语句中指定变量时向您发出警告(在一些非常罕见的情况下,在“if”语句中指定变量)如果你知道自己在做什么,这可能会很有用-这就是我发现这些警告的原因-虽然我猜有些人也会将其归类为“不必要的难读代码”类别,但在极少数情况下,我总是在“如果”中添加一条注释,说明作业是故意的,以防有人看到代码、注意到警告并认为可能是错误)。注意,
1===intval($variable)
不会带来任何好处。返回值不能赋值,因此
intval($variable)=1
将以同样的方式失败。@cHao:OP给出了两个例子
true==$variable
就是我说的原因
1===intval($variable)
是为了一致性:如果您有某种模式在某些情况下更安全,那么您应该在所有情况下都坚持使用它,因为否则即使在需要它的时候,您也会错过它。(也就是说,我觉得尤达风格太难看了。有更好的方法来实现这个目标。)事实上,当你遇到这样的情况时,你需要把“loooong复杂表达式”放在一个变量中,并在if中检查,但这与问题无关