0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: php, clang, типизация, dynamic typing, static typing, compile-time, run-time, integer, strong typing, weak typing, _zval_struct, zvalue_value, zend_value, динамическая типизация, статическая типизация</p>
1
<p>Теги: php, clang, типизация, dynamic typing, static typing, compile-time, run-time, integer, strong typing, weak typing, _zval_struct, zvalue_value, zend_value, динамическая типизация, статическая типизация</p>
2
<p>По виду типизации, языки программирования делятся на языки с динамической (<strong>dynamic typing</strong>) и статической типизацей (<strong>static typing</strong>). Статическая типизация - когда тип переменной точно известен в<strong>compile-time</strong>, например в<strong>Clang</strong>int a = 1; и в<strong>run-time</strong>тип переменной<em>"a"</em>может быть только<strong>integer</strong>.</p>
2
<p>По виду типизации, языки программирования делятся на языки с динамической (<strong>dynamic typing</strong>) и статической типизацей (<strong>static typing</strong>). Статическая типизация - когда тип переменной точно известен в<strong>compile-time</strong>, например в<strong>Clang</strong>int a = 1; и в<strong>run-time</strong>тип переменной<em>"a"</em>может быть только<strong>integer</strong>.</p>
3
<p>С динамической типизацией попроще. Тип переменной выводится в<strong>run-time</strong>, например, в PHP $a = 1; и в<strong>run-time</strong>переменная<em>"$a"</em>может быть числом 1 или даже строкой "string". Тип переменной обуславливает операции, которые мы можем с ней производить, например, числа - складывать, а в строках искать вхождение подстроки.</p>
3
<p>С динамической типизацией попроще. Тип переменной выводится в<strong>run-time</strong>, например, в PHP $a = 1; и в<strong>run-time</strong>переменная<em>"$a"</em>может быть числом 1 или даже строкой "string". Тип переменной обуславливает операции, которые мы можем с ней производить, например, числа - складывать, а в строках искать вхождение подстроки.</p>
4
<p>Типизация, в свою очередь, делится на сильную (<strong>strong typing</strong>) и слабую (<strong>weak typing</strong>). Когда мы выполняем какую-либо операцию при сильной типизации, то два операнда должны иметь один и тот же тип, например в Python 1 + “string” вызовет ошибку, потому что 1 - число, а "string" - строка.</p>
4
<p>Типизация, в свою очередь, делится на сильную (<strong>strong typing</strong>) и слабую (<strong>weak typing</strong>). Когда мы выполняем какую-либо операцию при сильной типизации, то два операнда должны иметь один и тот же тип, например в Python 1 + “string” вызовет ошибку, потому что 1 - число, а "string" - строка.</p>
5
<p>А вот в языках со слабой типизацией ошибки не будет, например в PHP 1 + “string” вернёт цифру 1. И причиной всему является приведение типов. Интерпретатор PHP начинает парсить строку "string", чтобы привести её к числу. Напарсить ничего стоящего у него не получается и он приводит строку "string" к цифре 0, которое в итоге и прибавляется к цифре 1. Строку "42string" интерпретатор приведёт к числу 42, а если надо привести строку "47.4string" к числу с плавающей точкой, то мы получим 47.4.</p>
5
<p>А вот в языках со слабой типизацией ошибки не будет, например в PHP 1 + “string” вернёт цифру 1. И причиной всему является приведение типов. Интерпретатор PHP начинает парсить строку "string", чтобы привести её к числу. Напарсить ничего стоящего у него не получается и он приводит строку "string" к цифре 0, которое в итоге и прибавляется к цифре 1. Строку "42string" интерпретатор приведёт к числу 42, а если надо привести строку "47.4string" к числу с плавающей точкой, то мы получим 47.4.</p>
6
<p>Таким образом, PHP - это язык со слабой динамической типизацией. Информация о выведенном типе переменной хранится в структуре "<strong>_zval_struct</strong>", в этой же структуре хранится ссылка на union-структуру<strong>zvalue_value</strong>(<strong>zend_value</strong>в PHP7), где и хранится реальное значение, на которое и указывает переменная.</p>
6
<p>Таким образом, PHP - это язык со слабой динамической типизацией. Информация о выведенном типе переменной хранится в структуре "<strong>_zval_struct</strong>", в этой же структуре хранится ссылка на union-структуру<strong>zvalue_value</strong>(<strong>zend_value</strong>в PHP7), где и хранится реальное значение, на которое и указывает переменная.</p>
7
<p>Знание того, как устроен и работает<strong>zend_value</strong>помогает ответить на такие вопросы, как, например, "А какой тип будет у переменной<em>"$a"</em>, которая ссылается на самое большое число (константа PHP_INT_MAX), если её сложить саму с собой (тип<strong>intger</strong>поменяется на<strong>double</strong>)?".</p>
7
<p>Знание того, как устроен и работает<strong>zend_value</strong>помогает ответить на такие вопросы, как, например, "А какой тип будет у переменной<em>"$a"</em>, которая ссылается на самое большое число (константа PHP_INT_MAX), если её сложить саму с собой (тип<strong>intger</strong>поменяется на<strong>double</strong>)?".</p>
8
8