理解PHP条件语句

时间:2015-05-18 13:40:29

标签: php

所以最近我用一个条件if语句编写了一些代码,如下所示...

if ($page['title'] = 'current_page') {
   'valid code'
}

现在发生的事情是这个代码被认为是有效的,当我运行代码时,它导致我的数据库上的请求过载并导致许多不必要的问题。

显然代码应该是以下

if ($page['title'] == 'current_page') {
   'valid code'
}

错过了' ='是我的问题的原因。我想要理解的是为什么被认为是有效的代码,如果不加注意,这会导致什么问题。

3 个答案:

答案 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