PHP源代码分析之变量
2009年07月26日
by 庆亮
0 comments
在PHP中所有变量都使用zval结构体来存放:
.png)
.png)
在PHP中可以使用函数 debug_zval_dump($var); 查看变量的引用信息。
相对于PHP的内核而已,我们编写的PHP代码都属于“用户空间”(user space),用户空间中的任何PHP变量都是由两部分组成:变量名(label)和变量值,从上面已经看到变量值存放在zval结构体中,那么变量名是放在哪里的呢? 下篇将继续分析PHP的HashTable结构体。
说明:本文中的图片均截自Marcus BörgerWez, FurlongSara, Golemon 三人的PHP ENTENSION WRITING (OSCON 2007)
在PHP 5.2.6中源码稍有不同,不过含义一样,无关大雅。
refcount用来表示有多少个变量指向本结构体,is_ref用来标示是否是引用。看两个例子:
$a = 5;
$b = $a;
$b = 10;
$a = 5 => value.lval = 5, refcount = 1, type = IS_LONG, is_ref = 0
$b = $a => value.lval = 5, refcount = 2, type = IS_LONG, is_ref = 0
$b = 10 => 1 value.lval = 5, refcount = 1, type = IS_LONG, is_ref = 0 $a
2 value.lval = 10, refcount = 1, type = IS_LONG, is_ref = 0 $b
在第三步时,PHP又产生了一个新的结构体用于保存变量$b, 原因在于原来$b指向的结构体的is_ref 成员的值为0. 这就是PHP的Copy on Write机制。
再看下一种情况:
$a = 123;
$b = &$a;
$b = 456;
则按下图保存