工作中遇到一个奇怪问题
0=”“或0=”
为何???
测试代码
<?php
//定义单双引号是因为php中单双引号表达的含义不同
$zero_string = '0';
$zero_string_shuang = "0";
$zero_int = 0;
if(empty($zero_string)){
echo 'zero_string empty 为空'."\n";
}
if($zero_string==''){
echo 'zero_string is 单引号为空'."\n";
}
if($zero_string==""){
echo 'zero_string is 双引号为空';
}
if($zero_string==null){
echo 'zero_string is null';
}
if(empty($zero_int)){
echo 'zero_int empty 为空'."\n";
}
if($zero_int==''){
echo 'zero_int 单引号为空'."\n";
}
if($zero_int==""){
echo 'zero_int 双引号为空'."\n";
}
if($zero_int==null){
echo 'zero_int 等于null'."\n";
}
if($zero_int===''){
echo 'zero_int 全等于单引号'."\n";
}
if($zero_int===""){
echo 'zero_int 全等于双引号'."\n";
}
if($zero_int===null){
echo 'zero_int 等于null'."\n";
}
if($zero_int==$zero_string){
echo 'zero int 等于 zero string'."\n";
}
if($zero_int==$zero_string_shuang){
echo 'zero int 等于 zero string shuang'."\n";
}
?>
实测结果
看到上述问题是不是产生了疑惑
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 \n";
}
if("sdf"==0){
echo "sdf == 0\n";
}
?>
测试成功,说明php中0与任何字符串比较都相等