Что такое # <some-number> рядом с объектом (someClass) в var_dump объекта? У меня есть вывод. Я прав? - PullRequest
13 голосов
/ 09 января 2012

Это код и его выходные данные, которые я использовал для вывода следующего вывода:

 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 для объектов независимо от того, к какому классу он принадлежит, был создан до сих пор.Который продолжает увеличиваться для каждого созданного объекта и уменьшается на 1, когда рефконт zval достигает нуля, т.е. Сборка мусора.

Я прав?

Ответы [ 2 ]

19 голосов
/ 09 января 2012

Это число 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);

А не количество созданных объектов.

8 голосов
/ 09 января 2012

Нет, это внутренняя ссылка на экземпляр объекта, если вы сделали

var_dump($obj1); 

снова, это все равно будет id # 2

EDIT

В случае вашего

var_dump(new stdClass);

PHP создает новый экземпляр stdClass и выдает его с помощью var_dump, давая вам экземпляр # 7.Однако, поскольку этот экземпляр является временным (вы не назначаете его для какой-либо переменной), он сразу же после этого снова уничтожается, поэтому объектный идентификатор № 7 снова доступен для выделения следующему объекту, который вы создаете с помощью

$obj6 = new stdClass; 
...