理解php赋值原理

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');

理解php赋值原理_第1张图片
当refcount为0时,变量会被销毁

引用赋值

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

理解php赋值原理_第2张图片
引用赋值两个变量指向同一个内存空间

你可能感兴趣的:(PHP)