В PHP понятия свободной типизации и строгой типизации относятся к тому, как язык обрабатывает типы переменных и преобразования типов.

Например, вы можете инициализировать переменную целочисленным значением.
Затем добавить к ней значение с плавающей запятой, тем самым превратив ее в число с плавающей запятой, а затем соединить ее со строковым значением, чтобы получить более длинную строку.

Начиная с PHP 5 вы можете использовать подсказку типа, чтобы указать ожидаемый тип данных аргумента в объявлении функции. Когда вы вызываете функцию, PHP проверяет, относятся ли аргументы к указанному типу. В противном случае во время выполнения возникнет ошибка, и выполнение будет остановлено.

Недельный набор текста, также известный как Свободный набор текста

По умолчанию PHP использует свободную типизацию или слабую типизацию, что допускает неявное преобразование типов и гибкую обработку типов. При свободной типизации переменные не имеют явно объявленного типа, и им можно переназначать различные типы значений во время выполнения.

Например:

$number = 10;   // $number is initially assigned an integer value
$number = "20"; // $number is now reassigned with a string value

В этом примере переменной $number изначально присваивается целочисленное значение, но позже ей присваивается строковое значение. PHP автоматически выполняет необходимое преобразование типов для размещения нового значения без возникновения ошибки.

Строгая типизация

PHP также предоставляет возможность строгой типизации, которая обеспечивает более строгую проверку типов и требует явного объявления типов. Когда включена строгая типизация, переменные и параметры функций должны строго соответствовать своим объявленным типам. Любая попытка присвоить значение другого типа или несовместимого типа приведет к фатальной ошибке.

Давайте посмотрим пример:

function addNumbers(int $a, int $b): int
{
    return $a + $b;
}

addNumbers(10, 20);         // 30
addNumbers(10.5, 20.5);     // 30*
addNumbers('10.5', 20.5);   // 30*
addNumbers(10, '20');       // 30
addNumbers('10', '20');     // 30
addNumbers('1sr0', '2sdf0');// TypeError: Argument #1 ($a) must be of type int, string given.

Таким образом, всякий раз, когда вызывается метод addNumbers, PHP ожидает получить соответствующие параметры указанных типов (int).

Когда функция вызывается с целым числом и строкой, PHP в фоновом режиме попытается преобразовать строку в int, а затем выполнить сложение.
Если PHP не сможет выполнить преобразование, выдаст фатальную ошибку TypeError, поскольку типы не соответствуют ожидаемым целочисленным типам.

(*) В случае, когда мы передаем float в параметры int-typed, PHP преобразует значения неправильного типа в ожидаемый скалярный тип если возможно.

addNumbers(10.5, 20.5) // 30
             ^     ^
            10    20

addNumbers(10.5, '20.5') // 30
             ^      ^
            10     20

Даже строковое представление этих чисел будет работать нормально.
PHP попытается привести “20.5” к его целочисленному значению, которое в данном случае равно 20, и обработает его соответствующим образом.

Если мы хотим включить строгую типизацию, вы можете использовать директиву declare(strict_types=1) в начале файла PHP. Эта директива гарантирует, что все объявления типов учитываются, а приведение типов отключено.

<?php

declare(strict_types=1)

function addNumbers(int $a, int $b): int
{
    return $a + $b;
}

addNumbers(10, 20);          // 30
addNumbers(10.5, 20.5);      // TypeError: Argument #1 ($a) must be of type int, float given.
addNumbers('10.5', 20.5);    // TypeError: Argument #1 ($a) must be of type int, string given
addNumbers(10, '20');        // TypeError: Argument #2 ($b) must be of type int, string given.
addNumbers('10', '20');      // TypeError: Argument #1 ($a) must be of type int, string given.
addNumbers('1sr0', '2sdf0'); // TypeError: Argument #1 ($a) must be of type int, string given.

Предостережения

Следует отметить, что функции может быть присвоено целое число, когда она ожидает плавающее значение, даже в контексте строгой типизации.
Это одно исключение в строгой типизации.

<?php

declare(strict_types=1)

function addNumbers(float $a, float $b): float
{
    return $a + $b;
}

addNumbers(10, 20);     // 30.0
addNumbers(10.5, 20.5); // 31.0
addNumbers(10.5, 20);   // 30.5

Это поведение основано на предположении, что целые числа можно безопасно преобразовать в числа с плавающей запятой без потери точности или функциональности.

Заключение

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

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

Не стесняйтесь Подписаться, чтобы получить больше подобного контента 🔔, аплодировать 👏🏻 , комментировать💬 и поделиться статьей с кем хочешь

И, как всегда, я ценю вашу поддержку и спасибо за чтение.