#是什么?对象的 var_dump 中的 object(someClass) 旁边?我有一个推论。我说得对吗?
这是代码&它的输出我用来得出下面的推论:
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_dump
中object(someClass)
行旁边的#
对象的 code> 实际上是 #
。在哪里,
count 是对象 / 对象的 zval 数量,无论到目前为止已创建的对象属于哪个类。对于创建的每个对象,它都会不断增加当 zval 的引用计数达到零(即垃圾回收)时,它会减 1。
我说得对吗?
This is the code & its output I used to draw the inference below:
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);
The output:
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) {
}
The #<some-number>
next to the line object(someClass)
in var_dump
of an object is actually #<count>
. Where,
count is the number of objects / zval's for objects irrespective of which class it belongs to that has been created till now. Which keeps getting incrementing for every object created & gets decremented by 1 when a refcount of a zval reaches zero i.e. Garbage Collection.
Am I right?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
该数字是
Z_OBJ_HANDLE_PP(struc)
,其中struc
是一个zval
,它通向Z_OBJVAL(zval).handle
,其中导致(zval).value.obj
。另请参阅 http://php.net/manual/en/internals2.variables。 intro.php
简而言之,我想说它是对象标识符 以十进制书写形式(ref):
而不是计数曾经创建的对象的数量。
That number is
Z_OBJ_HANDLE_PP(struc)
wherestruc
is azval
which leads toZ_OBJVAL(zval).handle
which leads to(zval).value.obj
.See as well http://php.net/manual/en/internals2.variables.intro.php
In short I would say it's the object identifier written in decimal form (ref):
And not the count of objects ever created.
不,它是对对象实例的内部引用,如果您
再次这样做,它仍然是 id #2
编辑
如果您的
PHP 正在创建 stdClass 的新实例并使用 var_dump 转储它,给你实例#7。但是,由于此实例是瞬态的(您没有将其分配给任何变量),因此它会立即再次被销毁,因此对象 id #7 再次可用于分配给您创建的下一个对象
No, it's an internal reference to the object instance, if you did
again, it would still be id #2
EDIT
In the case of your
PHP is creating a new instance of stdClass and dumping it using var_dump, giving you instance #7. However, because this instance is transient (you're not assigning it to any variable) it's being destroyed again immediately afterwards, so object id #7 is available again for allocation to the next object that you create with