今天只有我注意到并发现使用 === 运算符的重要性。您可以在以下示例中看到它:
$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
问题是,是否有任何情况下使用 === 运算符而不是使用 == 运算符很重要?
答案 0 :(得分:13)
当然,只有一个例子:array_search()
警告强>
此函数可能返回布尔
FALSE
,但也可能返回非布尔值,其值为FALSE
,例如0
或""
。有关更多信息,请阅读有关布尔值的部分。使用===
运算符测试此函数的返回值。
基本上,如果您使用任何成功返回值但失败时FALSE
>的函数,则应使用===
检查结果以确定(否则为什么会这样做?是一个大红色警告框?;))
更多示例:next()
,current()
或者也提到了strpos()
,stripos()
等字符串函数
即使substr()
,也没有明确提及:
返回字符串的提取部分或失败时返回FALSE。
但如果提取的部分是"0"
怎么办?它还评估为FALSE
,但这不是错误。
答案 1 :(得分:7)
始终选择===
而不是==
,除非您完全确定需要==
,因为==
不具有传递性。而这反过来对你的代码推理很重要。
请考虑以下代码段
if ( $a == $b && $b == $c ) {
// [1] assert: $a == $c
}
任何人都会从if条件推断出断言$a == $c
是真的,因为我们习惯于等式关系是传递的。但这不适用于==
,反例:
$a = "0";
$b = 0;
$c = null;
现在想想在编写代码时我们经常(有时无意识地)做出这种假设。这可能会导致严重的错误。
答案 2 :(得分:6)
在strpos()
中,找到字符串时为0,错误时为false。您必须使用===
来检查差异。
答案 3 :(得分:3)
===
是strict type comparison运算符,它不仅会检查值,还会检查类型,而==
只检查是否或值相同。
在比较数字或字符串时考虑一种情况:
if (4 === 4) // same type and value
{
// true
}
但
if (4 == "4") // same value but different type
{
// true
}
和
if (4 === "4") // same value but different type
{
// false
}
因此,在上述情况下,您必须明智地选择是否使用==或===
答案 4 :(得分:3)
你可能遇到麻烦的一个好例子是比较0和一个字符串,fx
if (0 == 'completed') {
// evaluates as TRUE
}
转换为int时,不以数字开头的字符串变为0
。将0到字符串的状态进行比较时,这可能会成为一个问题。
答案 5 :(得分:2)
===
运算符检查类型和值相等。
这就是0 === false
没有返回true的原因,因为它们的类型不同。
答案 6 :(得分:1)
strpos($ needle,$ haystack)和相关函数将返回false;如果$ needle是$ haystack的第一个字符,则返回0;并且有许多类似的功能。 在这种情况下使用==会给你不正确的结果,所以你应该总是使用===。手册明确指出了必要的地方。
答案 7 :(得分:0)
我最近在编写快速SQL查询解析器时遇到了这个问题。简而言之,我将引用的参数与它们的角落占位符进行比较。基本上,以下代码使我进行了一些艰难的调试时间(当然简化了示例)
$var = 0; // This is supplied dynamically
$someCondition = $var == '?';
$someCondition
一直都是真实的。 寒战
基本上任何非严格(==)< int> ==< string>比较将导致字符串转换为整数。根据输入,这可能最终为0或字符串的int值,如果它有任何值,即使整个字符串不是完全数字。
答案 8 :(得分:0)
如果比较两个数字字符串,则将它们作为整数进行比较。1
var_dump("15" == "0xF"); // TRUE
var_dump("15" === "0xF"); // FALSE
和TRUE间接等于FALSE 2
$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