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

Thi*_*key 13 php php-internals

这是我用来绘制下面推断的代码及其输出:

 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);  
Run Code Online (Sandbox Code Playgroud)

输出:

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

}
Run Code Online (Sandbox Code Playgroud)

#<some-number>行旁边object(someClass)var_dump物体实际上是#<count>.哪里,

count是对象的数量/ zval,而不管它到目前为止创建了哪个类.当zval的refcount达到零即垃圾收集时,它会继续为每个创建的对象进行递增并递减1.

我对吗?

hak*_*kre 19

这个数字是Z_OBJ_HANDLE_PP(struc)哪里struczval导致Z_OBJVAL(zval).handle导致(zval).value.obj.

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

简而言之,我会说它是以十进制形式(ref)编写的对象标识符:

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

而不是有史以来创建的对象的数量.


Mar*_*ker 8

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

var_dump($obj1); 
Run Code Online (Sandbox Code Playgroud)

再次,它仍然是id#2

编辑

在你的情况下

var_dump(new stdClass);
Run Code Online (Sandbox Code Playgroud)

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

$obj6 = new stdClass; 
Run Code Online (Sandbox Code Playgroud)