PHP переменная базовая принцип (а)

PHP

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

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

Первым делом поставим сначала нашу структуру zval, то есть все переменные в php будут реализованы в виде структуры zval

struct _zval_struct {
	union {
		long lval;
		double dval;
		struct {
			char *val;
			int len;
		} str;
		HashTable *ht;
		zend_object_value obj;
	} value;					//变量value值
	zend_uint refcount__gc;   //引用计数内存中使用次数,为0删除该变量
	zend_uchar type;		   //变量类型
	zend_uchar is_ref__gc;    //区分是否是引用变量,是引用为1,否则为0
};

Из содержимого приведенной выше структуры видно, что каждая переменная php будет определена变量类型,value值,引用计数次数и是否是引用变量четыре части

Примечание. Приведенная выше структура ZVAL представляет собой версию PHP5.3, структуру до версии PHP7.

тип переменной

Увидев это, некоторые друзья могут спросить меня, разве в php нет 8 типов данных? Но почему для соответствующего zvalue всего 5 значений?

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

Давайте посмотрим на тип переменной, соответствующий каждому значению zvalue.

zval.value.lval => 整型、布尔型、资源
zval.value.dval => 浮点型
zval.value.str  => 字符串
zval.value.*ht  => 数组
zval.value.obj  => 对象

Может быть странно видеть здесь, как логические значения и ресурсы соответствуют lval zval.value? Кроме того, как насчет NULL?

логический
Также как мы будем отображать true и false до 0 и 1 для хранения базы данных, так что PHP. Поэтому, когда PHP обнаруживает, что тип типа ZVal логично, он преобразует логию до 0 или 1 и хранить его в LVAL of ZVal.Value

ресурс
Ресурс — это специальная переменная для php, и php хранит идентификатор ресурса, соответствующий каждому ресурсу, в lval zval.value. Общие ресурсы: дескрипторы файлов, дескрипторы базы данных и т. д.

NULL
Для NULL лучше понять, потому что его можно отличить по значению типа zval, поэтому значение NULL не сохраняется в значении zval

переменная генерация

Как динамический язык, php не имеет привычки сначала объявлять переменные, а затем присваивать их, поэтому все они берут переменную и присваивают ее напрямую, так как же это реализовано?

Пример:

$name = "许铮的技术成长之路";

Контейнер переменного поколения

Фактически, каждый раз, когда переменной присваивается постоянное значение, соответственно будет генерироваться контейнер переменных. Только что приведенный пример сгенерирует переменный контейнер, тип контейнера — строковый, а значение —许铮的技术成长之路, а ref_count контейнера переменной будет увеличен на 1

Имя переменной связано с контейнером переменной

в то время как переменнаяnameКак это связано с переменным контейнером? На самом деле, он также использует внутренний механизм php, то есть哈希表. Имя переменной и указатель на структуру zval для каждой переменной хранятся в哈希表Таким образом реализуется отображение имен переменных в контейнеры переменных.

переменная область видимости

Выше мы упомянули концепцию имен переменных и сопоставлений контейнеров переменных. Для php переменные делятся на глобальные переменные и локальные переменные, затем все они хранятся в哈希表Вы внутри?

На самом деле нет, переменное хранилище также имеет понятие области видимости. Глобальные переменные хранятся в全局符号表внутри, а локальные переменные, то есть переменные внутри функций или объектов, хранятся в活动符号表(Каждая функция или объект поддерживает свою собственную активную таблицу символов отдельно. Жизненный цикл активной таблицы символов начинается, когда вызывается функция или объект, и заканчивается, когда вызов завершен)

Переменное разрушение

Переменное разрушение, разделенное на следующие ситуации:
1. Ручное уничтожение
2. Уничтожение механизмом сборки мусора (уничтожение после сброса счетчика ссылок до 0 и уничтожения корневого буфера при заполнении корневого буфера)

На этот раз мы в основном говорим о ручном уничтожении, то есть unset.Каждый раз, когда он уничтожается, имя переменной в таблице символов и соответствующая структура zval будут уничтожены, а соответствующая память будет возвращена в пул памяти, поддерживаемый php. (разделен на соответствующий список памяти)

Что касается разрушения механизма сборки мусора, то если вы не понимаете связанных с ним принципов, то предлагаю вам прочитать статьи, которые я писал ранееМеханизм сборки мусора, лежащий в основе принципа php

считать

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