PHP之0与空字符串关系测试以及详解
工作中遇到一个奇怪问题
0=”“或0=”
为何???
测试代码
<?php
//定义单双引号是因为php中单双引号表达的含义不同
$zero_string = "0";
$zero_string_shuang = "0";
$zero_int = 0;
if(empty($zero_string)){
echo "zero_string empty 为空"."
";
}
if($zero_string==""){
echo "zero_string is 单引号为空"."
";
}
if($zero_string==""){
echo "zero_string is 双引号为空";
}
if($zero_string==null){
echo "zero_string is null";
}
if(empty($zero_int)){
echo "zero_int empty 为空"."
";
}
if($zero_int==""){
echo "zero_int 单引号为空"."
";
}
if($zero_int==""){
echo "zero_int 双引号为空"."
";
}
if($zero_int==null){
echo "zero_int 等于null"."
";
}
if($zero_int===""){
echo "zero_int 全等于单引号"."
";
}
if($zero_int===""){
echo "zero_int 全等于双引号"."
";
}
if($zero_int===null){
echo "zero_int 等于null"."
";
}
if($zero_int==$zero_string){
echo "zero int 等于 zero string"."
";
}
if($zero_int==$zero_string_shuang){
echo "zero int 等于 zero string shuang"."
";
}
?>
实测结果
看到上述问题是不是产生了疑惑
0==” 和 0==””
0 == “0” 和 0== ‘0’
but
‘0’!=”” 和 ‘0’!=”
“0”!=”” 和 “0”!=”
why ? ? ? 根据值的传递性。
0==”” 并且 0==”0” 则”0” == “”
但是这和我们测试结果不符。”0”!=”” and “0”!=” and ‘0’!=” and ‘0’!=”“
那么问题来了?
查看php官网文档,php比较分为松散比较以及严格比较
松散比较(==)
TRUE | FALSE | 1 | 0 | -1 | “1” | “0” | “-1” | NULL | array() | “php” | “” | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
TRUE | TRUE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE |
FALSE | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE |
1 | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
0 | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | FALSE | TRUE | TRUE |
-1 | TRUE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
“1” | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
“0” | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE |
“-1” | TRUE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
NULL | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | TRUE |
array() | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | FALSE |
“php” | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE |
“” | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE |
严格比较(===)
TRUE | FALSE | 1 | 0 | -1 | “1” | “0” | “-1” | NULL | array() | “php” | “” | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
TRUE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
1 | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
0 | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
-1 | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
“1” | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
“0” | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE |
“-1” | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
NULL | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE |
array() | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE |
“php” | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE |
“” | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE |
看了这两种比较,虽然在松散比较中各种对应关系已经很明白了,但是为何出现上述这种对应关系?
1.php 比较不具有传递性
2.当涉及多种类型比较时,PHP处理比较的方式相当混乱。当字符串与整形进行比较时,字符串会强转为整形,字符串强转整形为0,所以会看到”“==0并且” == 0 ,所以就可以解释为何 0==”并且0==’0’,但是”!=’0’。因为”和’0’在进行比较时都被强转为0,所以才有了上述结果。既然0成立那么 “php” == 0或”sdf”==0也应该成立
<?php
if("php"==0){
echo "php == 0
";
}
if("sdf"==0){
echo "sdf == 0
";
}
?>
测试成功,说明php中0与任何字符串比较都相等
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: php字符串和0比较挖的一个坑
- 下一篇: 多个线程的程序CPU跑满的原因排查