牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2017-04-11 投稿人: 浏览次数:981

工作中遇到一个奇怪问题
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与任何字符串比较都相等

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。