В прошлый раз, когда я говорил с вами о механизме сбора мусора, некоторые мелкие партнеры больше интересовались основополагающим принципом, в частных письмах меня интересовали некоторые соответствующие знания о переменных. Поскольку нас больше интересуют переменные, давайте на этот раз поговорим о базовом принципе переменных систематически.
Переменная структура
Прежде всего, давайте выдвинем нашу структуру zval, то есть все переменные PHP будут реализованы в виде структуры zval.
struct _zval_struct { union { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } Value; //variable value Zend_uint refcount__gc; // Number of times used in reference counting memory, delete the variable for 0 Zend_uchar type; //variable type Zend_uchar is_ref_ gc; // distinguish whether it is a reference variable, referring to 1, or 0? };
Из содержания приведенной выше структуры мы видим, что каждая переменная PHP будет изменена на Тип переменной
、 Значение значения
、 Количество отсчетов ссылок
и Является ли она ссылочной переменной?
Четыре компонента
Примечание: Приведенная выше структура zval является структурой после php 5.3 и до php7.
Тип переменной
Видя это, некоторые из моих друзей могут спросить меня, есть ли в PHP восемь типов данных. Но почему для соответствующего значения существует только пять значений?
Причина в том, что, поскольку PHP учитывает экономию памяти, он повторно использует некоторые типы переменных и не определяет каждый тип переменной по отдельности.
Давайте рассмотрим тип переменной, которая соответствует каждому значению значения.
Zval. value. lval = > integer, boolean, resource Zval. value. dval = > floating-point type Zval. value. str => string Zval. value. * HT = > array Zval. value. obj = > object
Может быть странно видеть, как логический тип и ресурсы соответствуют уровню zval. ценность. А как насчет НУЛЯ?
Логический тип
Точно так же, как мы сопоставляем true и false с 0 и 1 для хранения базы данных, так же делает и php. Поэтому, когда PHP обнаруживает, что значение типа zval является логическим, он преобразует логический тип в 0 или 1 и сохраняет его на уровне zval. ценность.
Ресурсы
Ресурсы являются специальной переменной для php, и PHP хранит идентификаторы ресурсов, соответствующие каждому ресурсу в lval zval. ценность. Общими ресурсами являются: дескриптор файла, дескриптор базы данных и т.д.
НУЛЕВОЙ
Для NULL лучше понимать, что, поскольку его можно отличить по значению типа самого zval, значение NULL не сохраняется в значении zval.
Генерация переменных
Как динамический язык, PHP не имеет привычки сначала объявлять переменные, а затем назначать их, поэтому всегда следует назначать переменную напрямую, так как же этого добиться?
Приведите пример:
$name = Xu Zheng's technological growth path;
Генерация переменных контейнеров
Фактически, каждый раз, когда переменная присваивается константе, она генерирует контейнер переменных. В предыдущем примере создается контейнер переменных. Тип контейнера-это строковый тип, а значение value-строковый тип. Путь технологического роста Сюй Чжэна
И тогда ref_count контейнера переменной добавит 1
Имена переменных, связанные с контейнерами переменных
Переменные имя
Как это связано с переменными контейнерами? Фактически, он также использует внутренний механизм php, а именно Hashtable
. Имя переменной каждой переменной и указатель на структуру zval хранятся Hashtable
Таким образом, реализуется сопоставление имен переменных контейнерам переменных.
Область действия переменной
Выше мы упоминали концепцию сопоставления имени переменной и контейнера переменных. Для php переменные можно разделить на глобальные переменные и локальные переменные; затем они хранятся в одной Хэш-таблице
Это внутри?
На самом деле нет, переменное хранилище также имеет понятие области действия. Глобальные переменные хранятся в Глобальной таблице символов
Локальные переменные, то есть переменные внутри функций или объектов, хранятся в Таблице активных символов
Каждая функция или объект поддерживает свою собственную таблицу активных символов. Жизненный цикл активной таблицы символов начинается при вызове функции или объекта и заканчивается по завершении вызова.
Переменное разрушение
Переменное разрушение можно разделить на следующие ситуации: 1. Ручное уничтожение 2. Уничтожение механизма переработки мусора (Уничтожение после очистки отсчета ссылок 0 и Уничтожение после заполнения корневого буфера)
На этот раз мы в основном говорим о ручном уничтожении, а именно о сбое. Каждое уничтожение уничтожит имена переменных и соответствующую структуру zval в таблице символов и вернет соответствующую память в пул памяти, поддерживаемый PHP (разделенный на соответствующий список памяти в соответствии с размером памяти).
Для уничтожения механизма сбора мусора, если вы не понимаете соответствующих принципов, то я предлагаю вам взглянуть на механизм сбора мусора, лежащий в основе принципов php, о которых я писал ранее.
Отражение
Сегодня, с точки зрения сути, мы говорили о переменных от поколения к поколению. Для генерации переменных мы используем в качестве примера назначение констант. Как насчет распределения между переменными? В чем заключается принцип? И послушайте следующее разложение~