PHP之0与空字符串关系测试以及详解

来源:互联网 发布:投弹兵升级数据 编辑:程序博客网 时间:2024/06/06 03:13

工作中遇到一个奇怪问题
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也应该成立

<?phpif("php"==0){  echo "php == 0 \n";}if("sdf"==0){ echo "sdf == 0\n";}?>

这里写图片描述

测试成功,说明php中0与任何字符串比较都相等

1 0
原创粉丝点击