PHP变量引用底层原理与对象实例存储机制技术问询
PHP变量底层实现相关问题解答
1. 引用变量的符号表条目问题
执行$n =& $p时,PHP解释器会为$n在符号表中创建独立的条目,但这个条目和$p的条目指向同一个zval容器(PHP底层存储变量值的核心结构体)。
符号表是按变量名维护的,每个变量名对应一个独立的符号表条目。引用赋值的作用是让两个不同的符号表条目关联到同一个存储值的zval上,同时会把该zval的is_ref标记设为1,标记它处于被引用关联的状态。这和普通赋值($n = $p)不同:普通赋值会复制一份zval(不可变类型会用写时复制优化),而引用赋值是直接共享同一个zval。
2. 对象变量的存储问题
执行$c = new Alpha时,$c变量存储的是对象的标识符(句柄),这个标识符指向PHP底层zend_objects_store中存储的对象实例。
PHP里的对象通过句柄间接访问:创建对象时,实例会被存入zend_objects_store,变量$c拿到的是指向该实例的句柄。如果执行$d = $c,$d会复制这个句柄,所以$d和$c指向同一个对象实例,修改其中一个变量的对象属性,另一个也会看到变化——这也是PHP里对象看起来像“默认引用传递”的原因,但本质是变量存储的是对象句柄的拷贝。
内容的提问来源于stack exchange,提问作者CarloC
相关产品推荐
相关产品推荐

