Рубрики
Uncategorized

Переменные базового принципа PHP (1)

Автор оригинала: David Wong.

В прошлый раз, когда я говорил с вами о механизме сбора мусора, некоторые мелкие партнеры больше интересовались основополагающим принципом, в частных письмах меня интересовали некоторые соответствующие знания о переменных. Поскольку нас больше интересуют переменные, давайте на этот раз поговорим о базовом принципе переменных систематически.

Переменная структура

Прежде всего, давайте выдвинем нашу структуру 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, о которых я писал ранее.

Отражение

Сегодня, с точки зрения сути, мы говорили о переменных от поколения к поколению. Для генерации переменных мы используем в качестве примера назначение констант. Как насчет распределения между переменными? В чем заключается принцип? И послушайте следующее разложение~