在php中使用===而不是==的重要性!

在php中使用===而不是==的重要性!,php,comparison-operators,Php,Comparison Operators,今天,只有我注意到并发现了使用==操作符的重要性。您可以在以下示例中看到它: $var=0; if ($var==false) echo "true"; else echo "false"; //prints true $var=false; if ($var==false) echo "true"; else echo "false"; //prints true $var=0; if ($var===false) echo "true"; else echo "false"; //pr

今天,只有我注意到并发现了使用==操作符的重要性。您可以在以下示例中看到它:

$var=0;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=false;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=0;
if ($var===false) echo "true"; else echo "false";  //prints false
$var=false;
if ($var===false) echo "true"; else echo "false";  //prints true 
问题是,在任何情况下,使用===运算符而不是使用=运算符都很重要吗?

==
是运算符,它不仅会检查,还会检查它们的类型,而
=
只会检查是否相同

在比较数字或字符串时,请考虑一种情况:

但是


因此,在上述情况下,您必须做出明智的选择,是使用==还是==

当然,只有一个例子:

警告

此函数可能返回布尔值
FALSE
,但也可能返回计算结果为
FALSE
的非布尔值,例如
0
。有关更多信息,请阅读布尔值部分。使用
==
运算符测试此函数的返回值

基本上,如果您使用的任何函数在成功时返回值,但在失败时返回值
FALSE
,则应使用
==
检查结果以确保(否则为什么会出现一个大的红色警告框?;)


其他示例:,
或如前所述,字符串函数为等

尽管没有明确提及:

返回字符串的提取部分,失败时返回FALSE


但是,如果提取的部分是
“0”
,该怎么办?它的计算结果也是
FALSE
,但它不是一个错误。

操作符检查类型以及值的相等性


这就是为什么
0===false
不返回true的原因,因为它们不是同一类型。

在中,当字符串被发现时为0,而当字符串被误用时为false。您必须使用
==
来检查差异。

我最近在编写快速SQL查询解析器时遇到了这个问题。简而言之,我将引用的参数与其角大小写占位符进行比较。基本上,下面的代码让我遇到了一些困难的调试时间(当然,这个示例是简化的)

$someCondition
最终始终为真。颤抖

基本上,任何非严格(=)==比较都会导致字符串转换为整数。根据输入的不同,这可能最终为0或字符串的int值(如果有),即使整个字符串不是完全数字。

strpos($pinder,$haystack)和相关函数将返回false(如果$pinder不存在于$haystack中),如果$pinder是$haystack的第一个字符,则返回0;还有很多类似的功能。
在这种情况下,使用==可能会得到不正确的结果,因此应始终使用==。手册明确指出了哪些地方需要这样做。

始终选择
==
而不是
==
,除非您绝对确定需要
==
,因为
=
是不可传递的。这反过来对您的代码推理也很重要

考虑下面的代码片段

if ( $a == $b && $b == $c ) {
    // [1] assert: $a == $c
}
任何人都会从if条件推断断言
$a==$c
为真,因为我们已经习惯了等式关系是可传递的。但这不适用于
=
,反例:

$a = "0";
$b = 0;
$c = null;

现在想想我们在编写代码时(有时无意识地)做出这种假设的频率。这可能会导致严重的错误。

一个很好的例子是比较0和字符串fx

if (0 == 'completed') {
  // evaluates as TRUE
}

不以数字开头的字符串在转换为整数时变为
0
。当比较可以为0的状态与字符串时,这可能会成为一个问题。

如果比较两个数字字符串,则将它们作为整数进行比较

真实间接地等于虚假


您可以只说
echo$var==false等。参见@Chris。我已经看过那个问题了。但我的问题是关于例子,考虑使用“===”运算符,而不是“==”运算符是非常重要的。PHP不会自动将布尔值转换为“真”/“假”字符串。您的示例将生成
1
(对于
true
)或空字符串(对于
false
)。然而,通过使用三元运算符(如:
print($var==false))可以缩短示例真’:‘假’@Jakob:很公平!说得好,是的,我知道。但我想找出使用一个操作符而不是另一个操作符很重要的例子,比如看Felix Kling的回答。他明白我想要什么。@Bakhtiyor:正如你在我的例子中所看到的,这在比较数字和字符串时也很有用:)现在,我明白了,但在对你的答案发表评论时,没有例子。例如,Thx很多。
next
current
都不是很好的例子。如果存在类似于
数组(false)
中的假值怎么办?@Gumbo:没错。我刚才提到他们是因为他们的文档中也有这个警告框。但有一点需要注意(imho应该更强调):注意:您将无法区分数组的结尾和布尔FALSE元素。要正确遍历可能包含伪元素的数组,请参阅each()函数。
$var = 0; // This is supplied dynamically

$someCondition = $var == '?';
if ( $a == $b && $b == $c ) {
    // [1] assert: $a == $c
}
$a = "0";
$b = 0;
$c = null;
if (0 == 'completed') {
  // evaluates as TRUE
}
var_dump("15" == "0xF"); // TRUE
var_dump("15" === "0xF"); // FALSE
$a = 0;
$b = 'x';
var_dump(FALSE == $a); // TRUE
var_dump($a == $b);  // TRUE
var_dump($b == TRUE);  // TRUE
var_dump(FALSE === $a); // FALSE
var_dump($a === $b);  // FALSE
var_dump($b === TRUE);  // FALSE