php填坑

上线后出问题的原因 注意 0 和 '0'

<?php
    #测试下注释方法
    function a($a){
        var_dump(empty($a));
        var_dump($a==null);
    }

    //php填坑
    a('0');

原因说明

原文

测试案例

<?php
    #测试下注释方法
    function a($a){
        var_dump(empty($a));
        var_dump($a==null);
    }

    //php填坑
    a('0');


    echo 'php版本:'.PHP_VERSION; //5.6.28

$a =  0; 
$b="0"; 
$c= ''; 
$d= null; 
$e = false;

echo "5个变量-原始测试类型";
    var_dump($a);//int 0
    var_dump($b);//string '0'
    var_dump($c);//string ''
    var_dump($d);//null
    var_dump($e);//boolean false

echo "<h4>empty测试</h4>";
    var_dump(empty($a));//true
    var_dump(empty($b));//true
    var_dump(empty($c));//true
    var_dump(empty($d));//true
    var_dump(empty($e));//true

echo "<hr>";
    var_dump(isset($a));//true
    var_dump(isset($b));//true
    var_dump(isset($c));//true
    var_dump(isset($d));//【false】 见结论一
    var_dump(isset($e));//true

echo "<h4>(==)双等式测试</h4>";
    var_dump($a == $b);//true
    var_dump($a == $c);//true
    var_dump($a == $d);//true
    var_dump($a == $e);//true !!

    var_dump($b == $c);//【false】见结论二
    var_dump($b == $d);//【false】见结论二
    var_dump($b == $e);//true

    var_dump($c == $d);//true
    var_dump($c == $e);//true

echo "<h4>(===)三等式测试</h4>";
    var_dump($a === $b);//false
    var_dump($a === $c);//false
    var_dump($a === $d);//false
    var_dump($a === $e);//false

    var_dump($b === $c);//false
    var_dump($b === $d);//false
    var_dump($b === $e);//false

    var_dump($c === $d);//false
    var_dump($c === $e);//false

结论说明

结论一:关于变量类型的理解

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;

原文链接: php填坑 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙团 ( https://gyarmy.com/post-650.html )

发表评论

0则评论给“php填坑”