理解php赋值原理

来源:互联网 发布:centos开机自启动 编辑:程序博客网 时间:2024/06/06 13:04

PHP变量结构

PHP变量都放在一个zval结构中,它包含变量的值和相关信息

struct _zval_struct {    zvalue_value  value;     /* value 变量值 */    zend_uint  refcount__gc;  /* variable ref count 记录了指向该变量的符号数量 */    zend_uchar  type;          /* active type 变量类型 */    zend_uchar  is_ref__gc;    /* if it is a ref variable 该变量是否为引用变量 */};

创建一个变量的时候,PHP会为这个变量分配一个zval结构,填入相应的值,然后将这个变量的名字和指向这个zval的指针填入一个数组中。当你获取这个变量的时候,PHP会通过查找这个数组,获得对应的zval

PHP变量赋值

安装xdebug之后使用函数xdebug_debug_zval显示”refcount”和”is_ref”的值

$a = 10;xdebug_debug_zval(‘a’);

结果显示:
这里写图片描述

$b= $a;xdebug_debug_zval(‘a’);

结果显示:
这里写图片描述
refcount=2说它被两个变量同时使用

$a = 1;xdebug_debug_zval(‘a’);

结果显示:
这里写图片描述

因此变量赋值后,在两个变量没有发生改变时,它们指向的是同一个zval结构。当其中一个变量发生改变的时候,才会分配新的内存空间

对变量调用了函数 unset()时,”refcount“就会减1

$a = 10;$b = $a;xdebug_debug_zval('a');unset($b);xdebug_debug_zval('a');

这里写图片描述
当refcount为0时,变量会被销毁

引用赋值

$a = 10;xdebug_debug_zval('a');$b = &$a;xdebug_debug_zval('a');

这里写图片描述
引用赋值两个变量指向同一个内存空间

0 0
原创粉丝点击