Php 为什么有些人在if语句中将值放在变量之前?
例如,与$variable===true有什么不同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
<?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中检查,但这与问题无关