【问题标题】:What is #<some-number> next to object(someClass) in var_dump of an object? I have an inference. Am I right?对象的 var_dump 中的 object(someClass) 旁边的 #<some-number> 是什么?我有一个推断。我对吗?
【发布时间】:2012-02-05 22:57:42
【问题描述】:

这是我用来得出以下推论的代码及其输出:

 class a {
    public $var1;
    public $var2;
    }

 $obj0 = new a;
 var_dump($obj0);

 class b {
    public $var1;
    public $var2;
    public $var3;
    }

 $obj1 = new b;
 var_dump($obj1);

 $obj2 = new stdClass;
 var_dump($obj2);

 $obj3 = new stdClass;
 var_dump($obj3); 

 $obj4 = new stdClass;
 var_dump($obj4);

 $obj5 = new stdClass;
 var_dump($obj5);

 var_dump(new stdClass); 

 $obj6 = new stdClass;
 var_dump($obj6);  

输出:

object(a)#1 (2) {
  ["var1"]=> NULL
  ["var2"]=> NULL
}
object(b)#2 (3) {
  ["var1"]=> NULL
  ["var2"]=> NULL
  ["var3"]=> NULL
}
object(stdClass)#3 (0) {

}
object(stdClass)#4 (0) {

}
object(stdClass)#5 (0) {

}
object(stdClass)#6 (0) {

}
object(stdClass)#7 (0) {

}
object(stdClass)#7 (0) {

}

对象的var_dumpobject(someClass) 行旁边的#&lt;some-number&gt; 实际上是#&lt;count&gt;。哪里,

count 是 objects / zval's for objects 的数量,无论它属于哪个类,到目前为止已创建。对于创建的每个对象,它会不断增加,并且当 zval 的引用计数达到零(即垃圾收集)时减 1。

我说的对吗?

【问题讨论】:

  • 你还记得你之前关于垃圾收集/牛的问题之一中的object identifier that PHP has吗?
  • @hakre 是的,我记得。请原谅延迟的回复。现在浏览答案。

标签: php php-internals


【解决方案1】:

不,它是对对象实例的内部引用,如果你这样做了

var_dump($obj1); 

同样,它仍然是 id #2

编辑

如果是你的

var_dump(new stdClass);

PHP 正在创建一个新的 stdClass 实例并使用 var_dump 转储它,从而为您提供实例 #7。然而,因为这个实例是瞬态的(你没有将它分配给任何变量)它会立即再次被销毁,所以对象 id #7 可以再次分配给你创建的下一个对象

$obj6 = new stdClass; 

【讨论】:

    【解决方案2】:

    那个数字是Z_OBJ_HANDLE_PP(struc),其中struc是一个zval,它导致Z_OBJVAL(zval).handle,这导致(zval).value.obj

    另见http://php.net/manual/en/internals2.variables.intro.php

    简而言之,我会说这是用十进制形式写的object identifier (ref):

    php_printf("%sobject(%s)#%d (%d) {\n", COMMON, class_name, Z_OBJ_HANDLE_PP(struc), myht ? zend_hash_num_elements(myht) : 0);
    

    而不是曾经创建的对象的数量。

    【讨论】:

    • 是的,定义导致(zval).value.objValuestruct _zval_struct 的成员 zvalue_valueobj_zvalue_value ( zvalue_value ) 的成员 zend_object_value 谢谢!
    • from (ref): zend_object_value: _zend_object_value (zend_object_value ) 其中有 zend_object_handle handle;zend_object_handlers *handlers;,其 typedef 分别为 typedef unsigned int zend_object_handle; typedef struct _zend_object_handlers zend_object_handlers;。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多