所以最近我用一个条件if语句编写了一些代码,如下所示...
if ($page['title'] = 'current_page') {
'valid code'
}
现在发生的事情是这个代码被认为是有效的,当我运行代码时,它导致我的数据库上的请求过载并导致许多不必要的问题。
显然代码应该是以下
if ($page['title'] == 'current_page') {
'valid code'
}
错过了' ='是我的问题的原因。我想要理解的是为什么被认为是有效的代码,如果不加注意,这会导致什么问题。
答案 0 :(得分:2)
它被认为是有效的,因为它不是语法错误。当你这样做时:
if ($page['title'] = 'current_page')
赋值运算符=
告诉PHP将值current_page
赋给数组变量$page['title']
,而不管之前包含的变量是什么。实际上,$page['title']
变量现在包含值current_page
。现在,成功的赋值操作将计算为布尔值TRUE
,这使整个if
条件为真。
你所拥有的是一个逻辑错误。它不会被解释器/编译器捕获。相反,如果未检测到此类错误,则会在运行时(如您所经历的那样)导致(严重)问题。
有些人主张避免此类错误的一种方法是颠倒操作数的顺序:
if('current_page' = $page['title'])
在这种情况下,PHP会发现您正在尝试将变量分配给文字,这是一个无效的操作,并报告错误,该错误在编译时捕获。该错误迫使您清楚地查看代码,并使用比较运算符==
if('current_page' == $page['title'])
底线:=
是ASSIGNMENT运算符,而==
是COMPARISON运算符。意识到ASSIGNMENT和COMPARISON之间的区别将有助于您编写更好的代码。
答案 1 :(得分:1)
这是因为您可以在任何语句内部为变量赋值。这意味着,像这样的东西有效:
if($row = function_that_gives_something_or_null()) {
//do something with $row
}
else {
//$row was equal to false
}
如果不加注意,可能会导致很难调试逻辑问题。
答案 2 :(得分:0)
因为单个等号不是那种意思。原因是,在您的情况下,$page['title'] = 'current_page'
设置变量,然后始终评估if ($page['title'])
而不是总是为真,除非你是if ($page['title'] = false)
您使用=
进行分配;
$number = 3
double ==
是松散比较(使用类型转换)。
if ($string == 'test') // returns true or false
triple ===
是严格比较(数据类型必须匹配且值必须匹配)。
if ($string === $string) // returns true if those 2 objects are identical
有关详细信息,请参阅here。