Что такое #<some-number> рядом с объектом (someClass) в var_dump объекта? У меня есть вывод. Я прав?
Этот код и его вывод я использовал, чтобы сделать вывод ниже:
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 ответа
Это число 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);
И не количество объектов, когда-либо созданных.
Нет, это внутренняя ссылка на экземпляр объекта, если вы сделали
var_dump($obj1);
опять же, это все равно будет id #2
РЕДАКТИРОВАТЬ
В случае вашего
var_dump(new stdClass);
PHP создает новый экземпляр stdClass и выдает его с помощью var_dump, давая вам экземпляр #7. Однако, поскольку этот экземпляр временный (вы не присваиваете его какой-либо переменной), он сразу же после этого снова уничтожается, поэтому объектный идентификатор № 7 снова доступен для выделения следующему объекту, который вы создаете с помощью
$obj6 = new stdClass;