Несколько слов о типизации в PHP
По виду типизации, языки программирования делятся на языки с динамической (dynamic typing) и статической типизацей (static typing). Статическая типизация — когда тип переменной точно известен в compile-time, например в Clang
С динамической типизацией попроще. Тип переменной выводится в run-time, например, в PHP
Типизация, в свою очередь, делится на сильную (strong typing) и слабую (weak typing). Когда мы выполняем какую-либо операцию при сильной типизации, то два операнда должны иметь один и тот же тип, например в Python
А вот в языках со слабой типизацией ошибки не будет, например в PHP
Таким образом, PHP – это язык со слабой динамической типизацией. Информация о выведенном типе переменной хранится в структуре «_zval_struct», в этой же структуре хранится ссылка на union-структуру zvalue_value (zend_value в PHP7), где и хранится реальное значение, на которое и указывает переменная.
Знание того, как устроен и работает zend_value помогает ответить на такие вопросы, как, например, «А какой тип будет у переменной «$a», которая ссылается на самое большое число (константа PHP_INT_MAX), если её сложить саму с собой (тип intger поменяется на double)?».