让我们考虑以下代码:
class a {
public $var1;
function disp(){
echo $this->var1;
}
}
$obj1 = new a;
echo '<br/>After instantiation into $obj1:<br/>';
xdebug_debug_zval('obj1');
$obj1->var1 = "Hello ";
echo '<br/><br/>After assigning "Hello" to $obj->var1:<br/>';
$obj1->disp();
echo "<br/><br/>";
xdebug_debug_zval('obj1');
输出:
实例化到 $obj1 后:
obj1: (refcount=1, is_ref=0)=class a { public $var1 = (refcount=2, is_ref=0)=NULL }
将“Hello”分配给 $obj->var1 后:
Hello
obj1: (refcount=1, is_ref=0)=class a { public $var1 = (refcount=1, is_ref=0)='你好' }
逐个:
实例化到 $obj1 后:
obj1: (refcount=1, is_ref=0)=class a { public $var1 = (refcount=2, is_ref=0)=NULL }
为什么$obj1->var1
have refcount=2
当只有一个a类对象时?
是不是因为如何new
运算符进行赋值?
PHP 通过引用进行赋值。当实例化时new
,没有符号/变量名称与该实例关联。但是,类属性确实有名称。是个recount=2
因为这?
如果是这种情况,则在类实例的浅拷贝 WRT 中发生了 C.O.W(写入时复制)。虽然属性仍然指向实例化期间创建的属性的 zval,但使用new
.
Now,
将“Hello”分配给 $obj->var1 后:
Hello
obj1: (refcount=1, is_ref=0)=class a { public $var1 = (refcount=1, is_ref=0)='你好' }
所以,当我给属性赋值时$obj1->var1
该属性的新 zval 容器,因此refcount=1
?
这是否意味着在实例化过程中使用创建的 zval 容器new
仍然存在,但无法访问,因为没有与之关联的符号/变量名称?
请注意(来自xdebug:可变显示功能 http://xdebug.org/docs/display#xdebug_debug_zval):
debug_zval_dump()
不同于xdebug_debug_zval()
.
voidxdebug_debug_zval([字符串变量名 [ ...]] )