【6】插播:深入理解PHP原理之变量赋值
最近访问本帖者列表:flashroad
访问时间:2019-04-06 13:09 | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
在上一课《深入理解PHP原理之变量结构》中我已经介绍了PHP变量的内部结构,下面我将会对变量赋值过程中,PHP内部对数据处理的原理进行阐述,不过在讲述该原理前,需要先了解一下变量名和它的值是如何关联起来的,这个对变量赋值内部原理的理解非常重要,例如:
这个例子看起来非常简单,但是你知道“变量名a”和“数值1”是怎样关联起来的么? 在上节课一文中已经讲过,PHP中所有的值都是通过结构体zval存储的,大家如果对zval不太清楚,建议先看看上节课的内容,下面让我们先回顾一下zval
有了数值zval和变量名a,下面就是如何将两者关联的问题了。 因为变量名a其实有一个指针ptr_a,每次初始化一个变量时,系统会先开辟一块内存,将变量的值保持在zval中,然后将变量a和对应的指针ptr_a保持在数值中,同时让ptr_a指向zval的首地址,如下图所示,是不是很简单呢,哈哈;P | |
知道变量名和它的值如何关联后,我们就可以开始深入了解变量赋值原理,为了方便大家理解,我将通过图文的方式来讲解。
对于变量赋值原理,《深入理解PHP内核》中将该部分内容分为5种情况,所以我也通过这5个部分进行讲解,不过对于里面有些代码的讲解,感觉有点问题,在此就不多提了哈,开始切入正题。 情况1:赋值的左值is_ref=0,左值的refcount为1,左值==右值
======================================================== 情况2:赋值的左值is_ref=0,左值的refcount为1,右值is_ref=0
===================================================== 情况3:赋值的左值is_ref=1,左值!=右值
==================================================== 情况4:赋值的左值is_ref=0,左值的refcount为1,右值is_ref=1
======================================================== 情况5:赋值的左值is_ref=0,左值refcount!=1,右值is_ref=1,右值refcount>0
| |
后记:这是我结合《深入理解PHP内核》一书和鸟哥的博客写的,将两种总结后,然后通过比较图像化的语言来描述,鸟哥的博客写的很生动的,但是有些情况没有覆盖,然后有些代码层次的东西没有讲出来,《深入理解PHP内核》书中,有些地方没有讲清楚,然后感觉有些代码写的有问题(不知道是真有问题,还是自己的理解错误,反正我是推敲了好长时间,后续我会查阅php源码),并且对于这5种情况,排序有点乱,所以我将它们重新归类了一下。至于这些图,是我在理解该原理的过程中,脑海中所浮现的,所以就将他们画了出来,希望对大家理解该部分内容会有所帮助。
参考: http://www.laruence.com/2008/09/19/520.html | |