PHP源代码分析之变量

原创文章,转载请注明: 转载自庆亮的博客-webgame架构

本文链接地址: PHP源代码分析之变量

PHP中所有变量都使用zval结构体来存放:

 

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. 这就是PHPCopy on Write机制。

 

再看下一种情况:

 

$a = 123;

$b = &$a;

$b = 456;

 

则按下图保存

Leave a comment

0 Comments.

Leave a Reply

You must be logged in to post a comment.