在 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,但这不是错误。

【讨论】:

nextcurrent 不是很好的例子。如果有像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 最终始终为真。 颤抖

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

【讨论】:

【参考方案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 中使用 === 比较而不是 == 比较

为啥在 PHP 中使用 PDO 而不是 MySQL? [复制]

我如何在教义中使用 php8 属性而不是注释?

单引号是不是在 PHP 中自动转义?那么清洁的必要性是啥?

何时在 PHP 应用程序中使用 Redis 而不是 MySQL?

PHP:检查文件是不是直接加载而不是包含?