Рассмотрим следующий код:
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 . Но есть еще слишком много других дел, которые мне нужно сделать прямо сейчас. Я надеюсь, что скоро смогу опубликовать полезное обновление. А пока вот ссылки на код, на который я смотрел: