关注LAMP|PHP源代码分析|web架构|PHP扩展|Erlang|服务端架构

PHP源代码分析之变量

2009-07-26

原创文章,转载请注明: 转载自庆亮的博客-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;

 

则按下图保存

作者:庆亮 | 分类目录:PHP内核与扩展 | 标签:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>