Это код и его вывод, который я использовал для вывода ниже:
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>
var_dump
#<some-number>
рядом с object(someClass)
линии object(someClass)
в var_dump
объекта на самом деле #<count>
. Где,
count – количество объектов / zval для объектов, независимо от того, к какому классу он принадлежит, который был создан до сих пор. Который продолжает получать инкремент для каждого созданного объекта и уменьшается на 1, когда пересчет zval достигает нуля, т.е. сбор мусора.
Я прав?
Это число 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;