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

工作中遇到一个奇怪问题
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比较分为松散比较以及严格比较


松散比较(==)
TRUEFALSE10-1“1”“0”“-1”NULLarray()“php”“”
TRUETRUEFALSETRUEFALSETRUETRUEFALSETRUEFALSEFALSETRUEFALSE
FALSEFALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUETRUEFALSETRUE
1TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
0FALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUEFALSETRUETRUE
-1TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSE
“1”TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
“0”FALSETRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE
“-1”TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSE
NULLFALSETRUEFALSETRUEFALSEFALSEFALSEFALSETRUETRUEFALSETRUE
array()FALSETRUEFALSEFALSEFALSEFALSEFALSEFALSETRUETRUEFALSEFALSE
“php”TRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
“”FALSETRUEFALSETRUEFALSEFALSEFALSEFALSETRUEFALSEFALSETRUE

严格比较(===)
TRUEFALSE10-1“1”“0”“-1”NULLarray()“php”“”
TRUETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
1FALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
0FALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
-1FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
“1”FALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
“0”FALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE
“-1”FALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSE
NULLFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE
array()FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSE
“php”FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
“”FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUE

看了这两种比较,虽然在松散比较中各种对应关系已经很明白了,但是为何出现上述这种对应关系?

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与任何字符串比较都相等

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值