什么是对象的var_dump中的对象(someClass)旁边的#<some-number>? 我有一个推论。 我对吗?

这是我用来绘制下面的推论的代码和它的输出:

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) { } 

object(someClass) var_dump中的线object(someClass)旁边的#<some-number>实际上是#<count> 。 哪里,

count是对象的对象数/ zval的数量,不pipe它到目前为止创build的属于哪个类。 对于每个创build的对象,它都会不断增加,当zval的refcount达到零即垃圾收集时,它会减1。

我对吗?

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

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

总之,我会说这是用十进制forms( ref )写的对象标识符 :

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

而不是有史以来创build的对象的数量。

不,这是对象实例的内部引用,如果是的话

 var_dump($obj1); 

再次,它仍然是id#2

编辑

在你的情况下

 var_dump(new stdClass); 

PHP正在创build一个新的stdClass实例,并使用var_dump转储它,给你实例#7。 然而,因为这个实例是暂时的(你没有把它分配给任何variables),所以它在之后立即被销毁,所以对象ID#7再次可用于分配给你创build的下一个对象

 $obj6 = new stdClass;