从存储结构理解php空,null,0'0'false
来源:互联网 发布:大数据彩票分析 编辑:程序博客网 时间:2024/06/06 03:25
相信不少开发人员对网络上的 0 "0" null false '' 的讲解司空见惯,了然于胸了,
但我相信总有你忽略的细节,或者从变量结构角度出发,该如何解释。那么看看下边的验证吧。
echo 'php版本:'.PHP_VERSION; //5.6.28$a = 0; $b="0"; $c= ''; $d= null; $e = false;echo "5个变量-原始测试类型";var_dump($a);//int 0var_dump($b);//string '0'var_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操作以上五个变量,都返回false
强等于(===)比较 都为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
结论二:从底层结构理解
理解了上边结论一,那么下边的结论就容易理解了,还不太清楚的可以详细看下【 PHP内核的存储机制(分离/改变)】
其中的【1.zval结构】,【2.zend_uchar type】部分
string '0'与 string'' 不相等,(想一下就明白,同类型比较【1个长度】的字符串怎么可能 等于 【0个长度】 的字符串,zal的value结构里,对string值有len原始记录的)
int 0 却和 string'' 空相等,(非同类形比较,php会做类型转换)
string '0' 与 null 不相等
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;
0 0
- 从存储结构理解php空,null,0'0'false
- php中0,null,empty,空,false,字符串关系详解
- php 0,null,empty,空,false,字符串关系
- php中0,null,empty,空,false,字符串关系详解
- 掉进PHP中的坑--null,0,false,空字符串
- php中0与空 Null false的区别
- PHP中0与空 Null false的区别
- php中0,null,empty,空,false,字符串关系的详细介绍
- php中null,0,'',false的区别
- php false null 0 array string
- Javascript 中的false、0、null、undefined和空字符串对象
- Javascript 中的false、0、null、undefined和空字符串对象
- Javascript 中的false、0、null、undefined和空字符串对象
- Javascript 中的false、0、null、undefined和空字符串对象
- Javascript 中的false、0、null、undefined和空字符串对象
- Javascript 中的false、0、null、undefined和空字符串对象
- Javascript 中的false、0、null、undefined和空字符串对象
- Javascript 中的false、0、null、undefined和空字符串对象
- 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联
- Linux的一点复习
- 0417PHP
- Layer-list介绍与使用
- Uva-489 Hangman Judge
- 从存储结构理解php空,null,0'0'false
- 1121 平面中的点 point类Ⅰ
- 把mysql的一些状态输出到文件里显示
- 【Android View绘制体系】requestLayout
- [求助]iOS调用reloadData()不刷新数据,不调用cellForRowAt方法
- 198. House Robber
- RCNN
- 浅入浅出TensorFlow 5
- Vue-component全局注册