Этот вопрос проверяет понимание того, как PHP управляет памятью и почему язык кажется «простым», хотя внутри использует сложный механизм работы с zval-структурами.
PHP хранит данные в zval-структурах, которые содержат значение и счётчик ссылок. Каждый раз, когда переменная копируется, увеличивается счётчик ссылок, а само значение не дублируется. Когда счётчик ссылок достигает нуля, значение удаляется из памяти. Такая модель снижает расход памяти и делает язык эффективным, несмотря на его высокоуровневость. Основная идея — PHP сам освобождает память, и разработчику не нужно управлять ею вручную.
Работа с памятью в PHP основана на zval — внутренней структуре, которая содержит данные и служебную информацию.
Определение: zval — это контейнер для значения, который включает тип, само значение и счётчик ссылок.
Каждая переменная — это ссылка на zval, внутри которого находятся:
тип данных
указатель на конкретное значение
счётчик ссылок (refcount)
флаг "разделяемости" (is_ref)
Это позволяет PHP эффективно копировать и удалять данные.
Когда переменная копируется ($b = $a), PHP не дублирует само значение — только увеличивает refcount.
Когда переменная уничтожается или выходит из области видимости — refcount уменьшается.
Удаление из памяти происходит только при достижении 0.
Копирование фактически происходит только при изменении данных. Это позволяет экономить память.
Пример
php
$a = [1, 2, 3];
$b = $a; // значение общее
$b[] = 4; // теперь $b копируется
Помимо refcount существует GC, который устраняет циклические ссылки — ситуации, когда объекты ссылаются друг на друга.
Модель памяти PHP проста в использовании, но достаточно оптимизирована. Она подходит для веб-приложений, где важны скорость разработки и умеренная производительность.