在 php 中使用 === 而不是 == 的重要性! [复制]
Posted
技术标签:
【中文标题】在 php 中使用 === 而不是 == 的重要性! [复制]【英文标题】:The importance of using === instead of == in php! [duplicate] 【发布时间】:2011-03-06 07:16:06 【问题描述】:直到今天我才注意到并发现了使用 === 运算符的重要性。您可以在以下示例中看到它:
$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
问题是,在任何情况下使用 === 运算符而不是 == 运算符很重要?
【问题讨论】:
你可以说echo $var == false;
等等。
见***.com/questions/1117967/what-does-mean
@Chris。我已经看过那个问题了。但我的问题是关于示例,考虑使用“===”运算符而不是“==”运算符非常重要。
@Skilldrick:不,你不能。 php 不会自动将布尔值转换为“true”/“false”字符串。您的示例将产生1
(对于true
)或空字符串(对于false
)。但是,可以通过使用三元运算符来缩短示例,如下所示:print ($var == false) ? 'true' : 'false';
。
@Jakob:很公平!好点子。
【参考方案1】:
当然,只是一个例子:array_search()
警告
此函数可能返回布尔值
FALSE
,但也可能返回计算结果为FALSE
的非布尔值,例如0
或""
。请阅读有关布尔值的部分以获取更多信息。使用===
操作符来测试这个函数的返回值。
基本上,如果您使用任何成功返回值但失败时返回FALSE
的函数,您应该使用===
检查结果以确定(否则为什么会有大红色警告框?;))
更多示例:next()
、current()
或者也提到了strpos()
、stripos()
等字符串函数。
即使是substr()
,虽然没有明确提及:
返回提取的字符串部分,失败时返回 FALSE。
但是如果提取的部分是"0"
呢?它也计算为FALSE
,但这不是错误。
【讨论】:
next
和 current
不是很好的例子。如果有像array(false)
这样的 false 值怎么办?
@Gumbo:没错。我刚刚提到它们是因为它们的文档中也有这个警告框。但是有一个注意事项(应该更加强调恕我直言): 注意:您将无法区分数组的结尾和布尔值 FALSE 元素。要正确遍历可能包含 FALSE 元素的数组,请参阅 each() 函数。【参考方案2】:
始终选择===
而不是==
,除非您绝对确定需要==
,因为==
不具有传递性。这反过来又对您推理代码很重要。
考虑下面的代码sn-p
if ( $a == $b && $b == $c )
// [1] assert: $a == $c
任何人都会从 if 条件中推断出断言$a == $c
为真,因为我们已经习惯了等式关系是可传递的。但这不适用于==
,反例:
$a = "0";
$b = 0;
$c = null;
现在想想我们在编写代码时(有时不自觉地)做出这种假设的频率。这可能会导致严重的错误。
【讨论】:
【参考方案3】:在strpos()
中,找到字符串时为 0,丢失时为 false。您必须使用===
来检查差异。
【讨论】:
【参考方案4】:===
是 strict type comparison 运算符,它不仅会检查 values 还会检查它们的 type 而 ==
只检查是否 values 相同。
考虑比较数字或字符串的情况:
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
因此,在上述情况下,您必须做出明智的选择是使用 == 还是 ===
【讨论】:
是的,我知道。但我想找出使用一个运算符而不是另一个运算符很重要的示例。 以 Felix Kling 的回复为例。他明白我想要什么。 @Bakhtiyor:正如您在我的示例中看到的,这在比较数字和字符串时也很有用:) 现在,我可以看到,但是在对您的回答发表评论时,没有示例。例如,谢谢。【参考方案5】:比较 0 和字符串 fx 是一个很好的例子,你可能会遇到麻烦
if (0 == 'completed')
// evaluates as TRUE
不以数字开头的字符串在转换为 int 时变为 0
。在将可以为 0 的状态与字符串进行比较时,这可能会成为问题。
【讨论】:
【参考方案6】:===
运算符检查类型和值是否相等。
这就是0 === false
不返回 true 的原因,因为它们的类型不同。
【讨论】:
【参考方案7】:strpos($needle,$haystack) 如果 $needle 在 $haystack 中不存在,则 strpos($needle,$haystack) 和相关函数将返回 false,如果 $needle 是 $haystack 的第一个字符则返回 0;并且有很多类似的功能。 在这种情况下,使用 == 会给您带来不正确的结果,因此您应该始终使用 ===。手册清楚地指出了哪里是必要的。
【讨论】:
【参考方案8】:我最近在编写快速 SQL 查询解析器时遇到了这个问题。简而言之,我将引用的参数与它们的极端情况占位符进行比较。基本上,下面的代码让我经历了一些艰难的调试(例子当然是简化的)
$var = 0; // This is supplied dynamically
$someCondition = $var == '?';
$someCondition
最终始终为真。 颤抖
基本上任何非严格 (==)
【讨论】:
【参考方案9】:如果比较两个数字字符串,它们将作为整数进行比较。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
【讨论】:
以上是关于在 php 中使用 === 而不是 == 的重要性! [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 PHP 中使用 PDO 而不是 MySQL? [复制]