编程学习网 > PHP技术 > php是什么类型的语言?如何理解PHP是弱类型语言
2021
07-06

php是什么类型的语言?如何理解PHP是弱类型语言

相信不少开发人员对网络上的 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 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



总结:

对于 【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;
以上就是“php是什么类型的语言?如何理解PHP是弱类型语言”的详细内容,想要获取更多php教程欢迎关注编程学习网

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取