让我们考虑以下代码:
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 后:
Helloobj1: (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
只有refcount=2
一个a类对象时有?
是因为new
操作员如何赋值吗?PHP 使用引用进行赋值。当用 实例化时new
,没有符号/变量名称与该实例相关联。但是,类属性确实有名称。是recount=2
因为这个吗?
如果是这种情况,则使用浅拷贝 WRT 类实例会发生 COW(写入时复制)。虽然属性仍然指向在实例化期间使用new
.
现在,
将“Hello”分配给 $obj->var1 后:
Helloobj1: (refcount=1, is_ref=0)=class a { public $var1 = (refcount=1, is_ref=0)='你好' }
因此,当我为该属性分配一个值时,该属性$obj1->var1
的新 zval 容器,因此refcount=1
?
这是否意味着在使用实例化期间创建的 zval 容器new
仍然存在但由于没有与之关联的符号/变量名称而无法访问?
请注意(来自xdebug:Variable Display Features):
debug_zval_dump()
不同于xdebug_debug_zval()
.
void xdebug_debug_zval( [字符串变量名 [, ...]] )
显示有关变量的信息。
此函数显示有关一个或多个变量的结构化信息,包括其类型、值和引用计数信息。使用值递归地探索数组。该函数的实现方式与 PHP 的debug_zval_dump()函数不同,以便解决该函数所存在的问题,因为变量本身实际上是传递给函数的。Xdebug 的版本更好,因为它使用变量名在内部符号表中查找变量并直接访问所有属性,而无需处理实际将变量传递给函数。结果是这个函数返回的信息比 PHP 自己的显示 zval 信息的函数要准确得多。
UPDATE
:Dec 31th 2011:
我正在尝试查看使用new时如何进行内存分配。但是我现在要做的事情太多了。我希望我能尽快发布有用的更新。在那之前,这里是我正在查看的代码的链接: