13

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

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

}

对象的line in#<some-number>旁边实际上是. 在哪里,object(someClass)var_dump#<count>

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

我对吗?

4

2 回答 2

19

该数字是Z_OBJ_HANDLE_PP(struc)哪里struc是一个zval导致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);

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

于 2012-01-09T12:05:11.447 回答
8

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

var_dump($obj1); 

再次,它仍然是 id #2

编辑

在你的情况下

var_dump(new stdClass);

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

$obj6 = new stdClass; 
于 2012-01-09T11:47:03.980 回答