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

时间:2010-06-21 12:29:12

标签: 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";  //prints false
$var=false;
if ($var===false) echo "true"; else echo "false";  //prints true 

问题是,是否有任何情况下使用 === 运算符而不是使用 == 运算符很重要?

9 个答案:

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

如果$ haystack中不存在$ needle,那么

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