详解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。
类型不同但值相同的情况下进行处理
即使类型不同,但如果值相同,也返回真的情况。
这种情况下我不想使用“==”这种模棱两可的比较,因为可能会出现“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) 」许可协议授权,转载或使用请署名并注明出处。
相关推荐
-
Array_combine函数:让数组合并更简单
引言作为一名程序员,我们经常需要合并两个或多个数组。这时候,一个非常方便的函数就出现了,那就是array_combine函数。什么是array_combine函数?array_combine函数是PH...
-
使用PHP读取本地文件的方法
对于需要处理本地文件的PHP应用程序,读取本地文件是必不可少的操作。本文将介绍如何使用PHP读取本地文件。使用file_get_contents函数读取本地文件file_get_contents函数是...
-
PHP Cookies设置:了解cookie是如何工作的
在Web开发中,cookie是一种常见的技术,可以帮助我们保存用户信息,跟踪用户行为和提供个性化体验。在本文中,我们将深入探讨PHP cookies的设置。1. 什么是cookie?cookie是一种...
-
php获取当前月份及相关应用
在PHP中,获取当前月份的方法非常简单。只需要使用date()函数,并指定参数为“m”即可。代码如下:$month = date("m"); echo&nbs...
-
使用PHP的strip_tags()函数从字符串中去除HTML标签
strip_tags()函数可以从字符串中去除HTML标签。请注意,使用allow参数允许的HTML标记不会被剥离,但通常HTML标记总是被剥离。 顺便说一句,它有一个二...
-
如何使用PHP读取文件的6种方法
总结了用PHP读取文件的方法。 试着用6种方法读入文件。 file函数...
-
在PHP中检查文件存在的两种方法!(is_file)
我正在写如何检查 PHP 中是否存在“具有指定路径的文件”。 您可以使用以下两个函数来检查文件路径是否存在。...
-
通俗易懂的讲解nl2br()函数,将换行代码转换成br标签
这次,我将解释将换行字符转换为br标签的nl2br函数! 它非常容易使用! 但是,如果nl2br()函数使用不正确,它可能无法正确转换,所以需要注意!...
-
使用pathinfo函数轻松获取扩展名和文件名
你是否遇到过只想从文件路径中提取文件名或扩展名的情况? 我认为有多种方法,例如使用split分隔符拆分文件路径或使用substr函数提取文件路径。 但是...
-
使用PHP的is_null()函数检查变量是否为NULL
使用PHP的is_null()函数检查变量是否为NULL。 NULL表示没有值,不同于“0”或空字符串。 is_null()函数允许您检查变量是否为NU...