Что именно происходит при создании экземпляра с 'new'?

Рассмотрим следующий код:

class a {
    public $var1;
    function disp(){
        echo $this->var1;
        }    
    }

$obj1 = new a;
echo '
After instantiation into $obj1:
'; xdebug_debug_zval('obj1'); $obj1->var1 = "Hello "; echo '

After assigning "Hello" to $obj->var1:
'; $obj1->disp(); echo "

"; xdebug_debug_zval('obj1');

Вывод:

После создания в $ obj1:
obj1: (refcount = 1, is_ref = 0) = class a {public $ var1 = (refcount = 2, is_ref = 0) = NULL}

После присвоения "Hello" объекту $ obj-> var1:
Привет

obj1: (refcount = 1, is_ref = 0) = class a {public $ var1 = (refcount = 1, is_ref = 0) = 'Hello'}

Один за другим:

После создания экземпляра в $ obj1:
obj1: (refcount = 1, is_ref = 0) = class a {public $ var1 = (refcount = 2, is_ref = 0) = NULL}

Почему $ obj1-> var1 имеет ] refcount = 2 , когда есть только один объект класса a?

Это из-за того, как оператор new выполняет присваивание? PHP выполняет присваивание по ссылкам. При создании экземпляра с помощью new с этим экземпляром не связано имя символа / переменной. Но у свойств класса есть имена. recount = 2 из-за этого?

Если это так, то произошло C.O.W (копирование при записи) с неглубокой копией WRT экземпляра класса. Хотя свойства все еще указывают на zval свойств, созданных во время создания экземпляра с использованием new .

Теперь,

После присвоения "Hello" объекту $ obj-> var1:
Привет

obj1: (refcount = 1, is_ref = 0) = class a {public $ var1 = (refcount = 1, is_ref = 0) = 'Hello'}

Итак, когда я присваиваю значение свойству $ obj1-> var1 новый контейнер zval для этого свойства и, следовательно, refcount = 1 ?

Означает ли это, что контейнер zval был создан во время создания экземпляра с использованием new по-прежнему существует, но к нему нельзя получить доступ, поскольку с ним не связано имя символа / переменной?

Обратите внимание (из xdebug: Функции отображения переменных ):
debug_zval_dump () является отличается от xdebug_debug_zval () .

void xdebug_debug_zval ( [string varname [, ...]] )

Отображает информацию о переменной .

Эта функция отображает структурированную информацию об одной или нескольких переменных, в том числе информацию о ее типе, значении и количестве ссылок. Массивы рекурсивно исследуются со значениями. Эта функция реализована иначе, чем функция PHP debug_zval_dump () , чтобы обойти проблемы, возникающие у этой функции, поскольку сама переменная фактически передается в функцию.Версия Xdebug лучше, поскольку она использует имя переменной для поиска переменной во внутренней таблице символов и обращается ко всем свойствам напрямую, без необходимости иметь дело с фактической передачей переменной в функцию. В результате информация, которую возвращает эта функция, намного точнее, чем собственная функция PHP для отображения информации zval.

ОБНОВЛЕНИЕ : 31 декабря 2011 г .:

Я пытаюсь посмотреть, как происходит распределение памяти при использовании new . Но есть еще слишком много других дел, которые мне нужно сделать прямо сейчас. Я надеюсь, что скоро смогу опубликовать полезное обновление. А пока вот ссылки на код, на который я смотрел:

17
задан NikiC 18 March 2013 в 16:35
поделиться