11

直到今天我才注意到并发现了使用===运算符的重要性。您可以在以下示例中看到它:

$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 

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

4

9 回答 9

13

当然,仅举一个例子:array_search()

警告

此函数可能返回 Boolean FALSE,但也可能返回计算结果为 的非布尔值FALSE,例如0""。请阅读有关布尔值的部分以获取更多信息。使用===操作符来测试这个函数的返回值。

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


更多示例:next(), 或也提到的字符串函数,如,等。current()
strpos()stripos()

即使substr()没有明确提及:

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

但是如果提取的部分是"0"呢?它的计算结果也为FALSE,但这不是错误。

于 2010-06-21T12:32:27.067 回答
7

除非您绝对确定自己需要,否则请始终选择===,因为它不具有传递性。反过来,这对于您推理代码很重要。======

考虑以下代码片段

if ( $a == $b && $b == $c ) {
    // [1] assert: $a == $c
}

任何人都会从 if 条件中推断出断言$a == $c是真的,因为我们已经习惯了等式关系是可传递的。但这并不适用==,反例:

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

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

于 2010-06-21T12:43:00.907 回答
6

strpos()找到字符串时您有 0 并且在丢失时有 false 。您必须使用===来检查差异。

于 2010-06-21T12:35:05.320 回答
3

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

考虑比较数字或字符串时的情况:

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
}

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

于 2010-06-21T12:31:54.773 回答
3

您可能会遇到麻烦的一个很好的例子是比较 0 和字符串 fx

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

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

于 2010-06-21T12:43:17.827 回答
2

运算符检查类型和===值是否相等。

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

于 2010-06-21T12:33:08.213 回答
1

如果 $needle 在 $haystack 中不存在,strpos($needle,$haystack) 和相关函数将返回 false,如果 $needle 是 $haystack 的第一个字符,则返回 0;并且有很多类似的功能。在这种情况下,使用 == 会给您带来不正确的结果,因此您应该始终使用 ===。该手册清楚地确定了需要这样做的地方。

于 2010-06-21T12:36:28.103 回答
0

我最近在编写快速 SQL 查询解析器时遇到了这个问题。简而言之,我将引用的参数与它们的极端情况占位符进行比较。基本上,下面的代码让我经历了一些艰难的调试(当然,这个例子被简化了)

$var = 0; // This is supplied dynamically

$someCondition = $var == '?';

$someCondition最终始终是真实的。发抖

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

于 2010-06-21T12:35:19.300 回答
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
于 2010-06-21T13:15:44.230 回答