详解PHP比较运算符'=='和'==='之间的区别及注意事项

在 PHP 中进行值比较时,您使用 "==" 还是 "==="?

使用"=="比较字符串和数字时,如果在使用前没有完全理解规范,可能会导致意外的错误或安全漏洞。

这次,我们总结了比较运算符"=="和"==="的注意事项。

比较运算符'=='和'==='之间的区别

关于“==”和“===”的区别。

  • "=="相等比较

  • "==="严格比较

"===" 仅当值和类型匹配时才返回 true

为了解释方便,我先用“===”来解释严格比较。

“===”的严格比较只有当比较的值是相同的值并且是相同的类型时才返回true。

例如,如果将数字 1 与引号中的 '1' 进行比较,它将为 false,因为它是数字类型和字符类型之间的比较。

示例代码

// 相等比较
if ( 1 == '1' ){
     echo  'true' . "<br>" ;
} else {
     echo  'false' . "<br>" ;
} //true

// 严格比较
if ( 1 === '1' ){
     echo  'true' . "<br>" ;
} else {
     echo  'false' . "<br>" ;
} //false

"==" 类型转换后进行比较

下面的例子是PHP7之前的规范,因为PHP8改变了数值类型字符串的定义。

很多人误以为 '==' 是不比较类型的 '===' 版本,其实不然。

如果您只是不比较类型,则无法解释为什么以下比较为真。

示例代码

if ( 10 == '10元' ){
     echo  'true' ;
}else{
    echo 'false' ;
} //true

为什么10和'10元'相等?

这是因为如果任一值包含数字,则“==”比较是通过将字符串转换为数字来完成的。

因此,在这种情况下,“字符串'10元'”在比较之前被转换为“数字10” 。

结果,比较结果为“10 == 10”并返回 true。

将字符串转换为数字的规则

字符串转换成数字的时候,我总结了一个例子,说明它转换成什么样的数字。

尝试使用(int)将字符串转换为数字,并查看每个字符串是什么类型的数字。

示例代码

echo (int)'10元'."<br>";
echo (int)'500元'."<br>";
echo (int)'这个商品10元'."<br>";
echo (int)'hoge'."<br>";
echo (int)''."<br>";

执行结果

10
500
0
0
0

简而言之,“如果字符开头有数字,则将其转换为数字字符串,否则为0”。

因此,将 0 与不以数字开头的字符串进行比较将始终为真。

示例代码

if(0 == ''){
    echo 'true'."<br>";
}else{
    echo 'false'."<br>";
} //true

if(0 == 'hoge'){
    echo 'true'."<br>";
}else{
    echo 'false'."<br>";
} //true

如你所见,“==”比较可能会无意中返回 true。

详解PHP比较运算符'=='和'==='之间的区别及注意事项

类型不同但值相同的情况下进行处理

即使类型不同,但如果值相同,也返回真的情况。

这种情况下我不想使用“==”这种模棱两可的比较,因为可能会出现“10 =='10元'”为真的情况。

想要实现这个需求,可以使用以下两种方法。

1. 将值转换(强制转换)为字符串类型

通过在比较的时候将数值转换成字符串,这样就变成了字符串与字符串的比较,所以不用经过PHP自动转换就可以比较数值。

使用 (string) 为变量添加前缀会将其转换为字符串。

示例代码

$a = '10';
$b = 10;

if((string)$a === (string)$b){
    echo 'true';
}else{
    echo 'false';
} // true

2.使用strcmp函数比较字符串

另一种方法是使用 PHP 的内置函数 strcmp(),它允许您将两个值作为字符串进行比较。

由于如果值匹配则返回 0,因此可以通过与 0 进行比较来进行条件分支。

示例代码

$a = '10';
$b = 10;

if(strcmp($a, $b) === 0){
    echo 'true';
}else{
    echo 'false';
} // true

结语

PHP的一大魅力在于,它可以自动转换,即使编写源代码时不考虑类型,也可以运行,但同时也可能会导致意外的风险。

熟悉 PHP 的比较运算符。

这是使用 PHP 的 == 比较字符串和数字时要注意的一点。


本文来源:词雅网

本文地址:https://www.ciyawang.com/php-type-comparison.html

本文使用「 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 」许可协议授权,转载或使用请署名并注明出处。

相关推荐