Динамическая типизация в PHP – как?
Все мы знаем, что PHP является языком со слабой типизацей, и это является одновременно и плюсом, и минусом нашего любимого ЯП. На днях попалась интересная статья на эту тему, и я представляю вам ее краткое содержание (для всех интересующихся, я оставлю ссылки на источники в конце поста).
Итак, начнем. Базовой структурой данных в PHP является zval (сокращение от «Zend value»). Этот zval является структурой, написанной, на языке C, ведь именно на нем реализован интерпретатор PHP, и главные поля этой структуры – тип и значение.
Тип может принимать 8 значений (именно столько типов значений имеет PHP):
- null: IS_NULL
- булевое значение: IS_BOOL
- целое число: IS_LONG
- число с плавающей точкой: IS_DOUBLE
- строка: IS_STRING
- массив: IS_ARRAY
- объект: IS_OBJECT
- ресурс: IS_RESOURCE
Теперь вы знаете что можно ответить на вопрос о типах данных в PHP 😁 (все остальное является псевдотипами). Как вы, скорее всего, обратили внимание, числа разделяются на double и long.Если с double все, более или менее, понятно, то long стоит немного объяснить. Там может хранится только signed integer, то есть, только число, имеющее возможность принимать отрицательное значение.
Что же хранится в поле значения? Там лежит тип данных union, а значит, что он определяет несколько членов-данных различных типов, но в каждый момент времени может использоваться только одно значение из определенных в юнионе.
Источники:
- Статья на хабре: https://habr.com/ru/articles/226707/
- Книга по внутренностям PHP: https://www.phpinternalsbook.com/