这是代码&它的输出我用来绘制下面的推论:
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) {
}
对象的#<some-number>
中object(someClass)
行旁边的var_dump
实际上是#<count>
。其中,
count是对象的对象 / zval的数量,无论它到目前为止创建了哪个类。对于每个创建的对象,它都会不断增加当zval的refcount达到零,即垃圾收集时,减1。
我是对的吗?
答案 0 :(得分:17)
这个数字是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);
而不是有史以来创造的物品数量。
答案 1 :(得分:8)
不,它是对象实例的内部引用,如果你做了
var_dump($obj1);
再次,它仍然是id#2
修改强>
就你的
而言var_dump(new stdClass);
PHP正在创建一个新的stdClass实例并使用var_dump转储它,为您提供实例#7。但是,因为这个实例是瞬态的(你没有将它分配给任何变量),所以它会在之后立即被再次销毁,因此对象id#7再次可用于分配给你用
创建的下一个对象$obj6 = new stdClass;