商务合作加微X:2230304070
学习与交流:PHP技术交流微X群
点击获取:Github Copilot官网正版登录,领券下单1.68元体验5-7天
相信不少研发人员对网络上的 0 "0" null false 的讲解司空见惯,了然于胸了。
但我相信总有你忽略的细节,或从变量结构方向出发,该怎样解释。那样瞧瞧下边的验证吧。 echo php版本:.PHP_VERSION; //7.4.28$a = 0
; $b="0"
;
$c= ; $d= null
; $e = false
; echo "5个变量-原始测试类型"
; var_dump($a);//int 0var_dump($b);//string 0var_dump($c);//string var_dump($d);//nullvar_dump($e);//boolean falseecho "<h4>empty测试</h4>"
; var_dump(empty($a));//truevar_dump(empty($b));//truevar_dump(empty($c));//truevar_dump(empty($d));//truevar_dump(empty($e));//trueecho "<hr>"
; var_dump(isset($a));//truevar_dump(isset($b));//truevar_dump(isset($c));//truevar_dump(isset($d));//【false】 见结论一var_dump(isset($e));//trueecho "<h4>(==)双等式测试</h4>"
; var_dump($a == $b);//truevar_dump($a == $c);//truevar_dump($a == $d);//truevar_dump($a == $e);//true !!var_dump($b == $c);//【false】见结论二var_dump($b == $d);//【false】见结论二var_dump($b == $e);//truevar_dump($c == $d);//truevar_dump($c == $e);//trueecho "<h4>(===)三等式测试</h4>"
; var_dump($a === $b);//falsevar_dump($a === $c);//falsevar_dump($a === $d);//falsevar_dump($a === $e);//falsevar_dump($b === $c);//falsevar_dump($b === $d);//falsevar_dump($b === $e);//falsevar_dump($c === $d);//falsevar_dump($c === $e);//false总结:
对于 【0 ;"0" ; ;null;false】五种类型
empty操作以上五个变量,都返回true
强等于(===)比较 都为false,同强语言结果 但针对(==)比较,需要重视string类型,触及到底层结构与类型转换
》》》程序员福利《《《 结论一:关于变量类型的理解
1.null为不存在之意:php底层的zval空间里(结构见下方)无存其value值,只存储了一个type标志其 IS_NULL(因此解释了 empty(null)=true,isset(null)=false ,isset()=true) 2.【0 ; "0" ; "" ; false 】:这四个为存在,php底层是开辟zval空间存储,有value,有type结论二:从底层结构理解
理解了上边结论一,那样下边的结论就容易理解了
其中的【1.zval结构】,【2.zend_uchar type】部分 1 string 0与 string 不相等,(想一下就明白,同类型比较【1个长度】的字符串怎么可能 等于 【0个长度】 的字符串,zal的value结构里,对string值有len原始记录的)。
2 int 0 却和 string 空相等,(非同类形比较,php会做类型转换)
3 string 0 与 null 不相等 4 int 0 与 null 相等
说白了,针对php,碰到string "0" 的等式判断的时候,停顿重视一下就行。其他的等式判断正常,符合公众熟知的php研发思维。
php变量zval结构: //存放变量的基本信息struct _zval_struct { /* Variable information */ zvalue_value value; /* 变量值保留在这儿 12字节*/zend_uint refcount;//4字节,变量引用计数器 zend_uchar type; /* active type变量类型 1字节*/ zend_uchar is_ref;//是不是变量被&引用,0暗示非引用,1暗示引用,1字节
};
//存放变量的值 typedef union
_zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; //4字节 int len; //4字节
} str; HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value; 参考链接: https://blog.csdn.net/ty_hf/article/details/70217267以上便是本篇分钟的所有内容,期盼各位程序员们奋斗提高个人技术。最后,博主温馨提示:每日阅读5分钟,每日学习一点点,每日进步一点点。
|