学习PHP底层,你是如何理解php是弱类型语言的?

Posted PHP自学中心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习PHP底层,你是如何理解php是弱类型语言的?相关的知识,希望对你有一定的参考价值。







文章来自:https://blog.csdn.net/ty_hf/article/details/70217267

点击加入:









技术交流微信群

  
    
    
  



















我们在学习中单枪匹马,还不如一次短短的交流,你可以在别人吸取各种学习经验。
学习方法以及学习技巧,所以,学习与交流少不了一个圈子,提升你的学习技能。
请点击加技术群:PHP自学中心交流群 
  
    
    
  






视频教程分享

1 mysql的零距离接触 视频教程 
公众号里回复:20190128

2 LVS负载均衡视频讲解
公众号里回复:负载均衡

3 php异步通信框架Swoole实战教程
公众号里回复:08250024

4 Laravel5.x底层实战兼核心源码解析
链接:http://www.mano100.cn/thread-344-1-1.html

5 由浅入深析ThinkPHP5ThinkPHP6底层源码
链接:http://www.mano100.cn/thread-1-1-1.html

6 全方位深度剖析PHP7底层源码(完整版)
链接:http://www.mano100.cn/thread-93-1-1.html
  
    
    
  
  
    
    
  


精选文章正文

相信不少开发人员对网络上的 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是弱类型语言的?的主要内容,如果未能解决你的问题,请参考以下文章

php 多态的理解

php多态的理解

不需要声明变量类型的语言的质量是弱类型还是动态类型的例子

如何理解c/c++和php语言的区别

简单理解弱类型动态类型解释型语言

PHP内核之旅-3.变量