Я понимаю, что это старый вопрос, но здесь есть более конкретная информация о том, как PHP обрабатывает вопросы, заданные ОП.
Это страница из справочника по PHP, с которой вы хотели бы начать:
Введение в переменные
Я знаю, что ссылки не являются предпочтительными, но эта ссылка должна быть стабильной, и я не хочу копировать справочную документацию PHP по оптовым ценам.Вот основные моменты.
OP: Как PHP знает, какой тип переменных он использует (или делает это)?
PHP написан на C и использует Cstruct typedef, которую он вызывает zval вместе с typedef для C union, который вызывает zval_value для представления всех переменных.
typedef struct _zval_struct {
zvalue_value value; /* variable value */
zend_uint refcount__gc; /* reference counter */
zend_uchar type; /* value type */
zend_uchar is_ref__gc; /* reference flag */
} zval;
" Движокпытается скрыть сложность концепции переменной, которая может быть любого типа, предоставляя унифицированный и интуитивно понятный набор макросов для доступа к структурам различных полей . "
" PHP является динамическим, слаботипизированный язык, использующий копирование при записи и подсчет ссылок. "Подсчет ссылок и Copy-on-write (COW) - это две мощные концепции, которые использует PHP, но я не буду вдаваться в них, но о них стоит прочитать.
" Слабая типизация подразумевает предпочтение движкапреобразовывать или приводить переменные в требуемый тип во время выполнения . Подсчет ссылок - это средство, с помощью которого механизм может сделать вывод, когда переменная больше не имеет ссылок в коде пользователя, и, таким образом, способна освободить структуры, связанные спеременная. "
" Значение zval_value представляет собой объединение, которое может представлять все типы, которые может содержать переменная."
" ... переменная может бытьодного типа, переменные данные представлены соответствующим полем в объединении zval_value. Сам zval содержит тип, счетчик ссылок и флаг, указывающий, является ли переменная ссылкой."
Как компилируется PHP?
«Компилировать» - это широкое слово, которое может иметь разные значения, и PHP не компилируется в традиционном смысле.Он выполняет своего рода предварительную компиляцию, которая преобразует исходный код в коды операций, которые являются инструкциями, которые могут быть выполнены процессором.Эти коды операций кэшируются, что не позволяет PHP анализировать часто называемые скрипты.
Откуда он знает, каким будет тип переменной?Это вообще волнует?
Как уже упоминалось выше, это PHP-движок " предпочитает преобразовывать или приводить переменные в требуемый тип во время выполнения ".По своей сути, PHP всегда сохраняет то, что определяет тип переменной при ее создании, но когда на переменную ссылаются, PHP делает другое определение того, какой тип основан на контексте, в котором он используется.
" PHP слабо типизирован, так как движок предоставляет функции API для преобразования переменных из одного типа в другой."
В движке есть набор макросов, которые он использует для работы с zvals для преобразованиятип переменной, так что вам обычно не приходится иметь дело с этим.
Если вы хотите увидеть, как zvals выглядит в действии, их можно вывести с помощью:
debug_zval_dump($variableName);