在php中使用===而不是==的重要性!
今天,只有我注意到并发现了使用==操作符的重要性。您可以在以下示例中看到它:在php中使用===而不是==的重要性!,php,comparison-operators,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"; //pr
$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
问题是,在任何情况下,使用===运算符而不是使用=运算符都很重要吗?该==
是运算符,它不仅会检查值,还会检查它们的类型,而=
只会检查值是否相同
在比较数字或字符串时,请考虑一种情况:
但是
及
因此,在上述情况下,您必须做出明智的选择,是使用==还是==当然,只有一个例子: 警告 此函数可能返回布尔值
FALSE
,但也可能返回计算结果为FALSE
的非布尔值,例如0
或”
。有关更多信息,请阅读布尔值部分。使用==
运算符测试此函数的返回值
基本上,如果您使用的任何函数在成功时返回值,但在失败时返回值FALSE
,则应使用==
检查结果以确保(否则为什么会出现一个大的红色警告框?;)
其他示例:,
或如前所述,字符串函数为等 尽管没有明确提及: 返回字符串的提取部分,失败时返回FALSE
但是,如果提取的部分是
“0”
,该怎么办?它的计算结果也是FALSE
,但它不是一个错误。操作符检查类型以及值的相等性
这就是为什么
0===false
不返回true的原因,因为它们不是同一类型。在中,当字符串被发现时为0,而当字符串被误用时为false。您必须使用==
来检查差异。我最近在编写快速SQL查询解析器时遇到了这个问题。简而言之,我将引用的参数与其角大小写占位符进行比较。基本上,下面的代码让我遇到了一些困难的调试时间(当然,这个示例是简化的)
$someCondition
最终始终为真。颤抖
基本上,任何非严格(=)==比较都会导致字符串转换为整数。根据输入的不同,这可能最终为0或字符串的int值(如果有),即使整个字符串不是完全数字。strpos($pinder,$haystack)和相关函数将返回false(如果$pinder不存在于$haystack中),如果$pinder是$haystack的第一个字符,则返回0;还有很多类似的功能。
在这种情况下,使用==可能会得到不正确的结果,因此应始终使用==。手册明确指出了哪些地方需要这样做。始终选择
==
而不是==
,除非您绝对确定需要==
,因为=
是不可传递的。这反过来对您的代码推理也很重要
考虑下面的代码片段
if ( $a == $b && $b == $c ) {
// [1] assert: $a == $c
}
任何人都会从if条件推断断言$a==$c
为真,因为我们已经习惯了等式关系是可传递的。但这不适用于=
,反例:
$a = "0";
$b = 0;
$c = null;
现在想想我们在编写代码时(有时无意识地)做出这种假设的频率。这可能会导致严重的错误。一个很好的例子是比较0和字符串fx
if (0 == 'completed') {
// evaluates as TRUE
}
不以数字开头的字符串在转换为整数时变为
0
。当比较可以为0的状态与字符串时,这可能会成为一个问题。如果比较两个数字字符串,则将它们作为整数进行比较
真实间接地等于虚假
您可以只说
echo$var==false代码>等。参见@Chris。我已经看过那个问题了。但我的问题是关于例子,考虑使用“===”运算符,而不是“==”运算符是非常重要的。PHP不会自动将布尔值转换为“真”/“假”字符串。您的示例将生成1
(对于true
)或空字符串(对于false
)。然而,通过使用三元运算符(如:print($var==false))可以缩短示例真’:‘假’代码>@Jakob:很公平!说得好,是的,我知道。但我想找出使用一个操作符而不是另一个操作符很重要的例子,比如看Felix Kling的回答。他明白我想要什么。@Bakhtiyor:正如你在我的例子中所看到的,这在比较数字和字符串时也很有用:)现在,我明白了,但在对你的答案发表评论时,没有例子。例如,Thx很多。next
和current
都不是很好的例子。如果存在类似于数组(false)
中的假值怎么办?@Gumbo:没错。我刚才提到他们是因为他们的文档中也有这个警告框。但有一点需要注意(imho应该更强调):注意:您将无法区分数组的结尾和布尔FALSE元素。要正确遍历可能包含伪元素的数组,请参阅each()函数。
$var = 0; // This is supplied dynamically
$someCondition = $var == '?';
if ( $a == $b && $b == $c ) {
// [1] assert: $a == $c
}
$a = "0";
$b = 0;
$c = null;
if (0 == 'completed') {
// evaluates as TRUE
}
var_dump("15" == "0xF"); // TRUE
var_dump("15" === "0xF"); // FALSE
$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