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

В этом уроке вы узнаете, как включить строгую типизацию с помощью директивы PHP strict_types.

Введение в строгую типизацию PHP

Подсказки типов (type hints) позволяют объявлять типы для параметров функций и возвращаемых значений. Например:

function add(int $x, int $y)
{
    return $x + $y;
}

echo add(1.5, 2.5); // 3

В этом примере функция add() принимает два целых числа и возвращает их сумму.

Однако, когда вы передаете два плавающих (float) числа 1.5 и 2.5, функция add() возвращает 3, потому что PHP по умолчанию неявно приводит значения к целевым типам. В данном случае PHP преобразует плавающие значения (floats) в целые (integers).

Чтобы включить строгую типизацию, можно использовать директиву declare(strict_types=1) в начале файла, как показано ниже:

declare(strict_types=1);

function add(int $x, int $y)
{
    return $x + $y;
}

echo add(1.5, 2.5); 

Добавив в файл директиву strict typing, код будет выполняться в строгом режиме. PHP включает строгий режим по каждому файлу.

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

Если вы выполните скрипт снова, PHP выдаст ошибку следующего вида:

Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type int, float given, called in ...

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

PHP strict_types: особый случай

Директива строгой типизации имеет особый случай, когда целевым типом является float. Если целевой тип - float, вы можете передать значение типа integer. Например:

declare(strict_types=1);

function add(float $x, float $y)
{
    return $x + $y;
}

echo add(1, 2); // 3

PHP strict_types и include

Предположим, вы определили функцию add() в файле functions.php:

declare(strict_types=1);

function add(int $x, int $y)
{
    return $x + $y;
}

И вы включаете functions.php в файл index.php:

include 'functions.php';

echo add(1.5, 2.5);

Несмотря на то, что в functions.php объявлена директива строгой типизации, она не влияет на index.php.

Обратите внимание, что конструкция include загружает в файл код из другого файла.

Когда вы вызываете функцию, определенную в файле со строгой типизацией (functions.php) из файла без строгой типизации (index.php), PHP будет учитывать предпочтения вызывающей стороны (index.php).

Это означает, что вызывающая сторона сама решает, использовать строгий режим или нет. В данном случае index.php не будет выполняться в строгом режиме.

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

Запрет на переопределение примитивных типов работает только в файле, где используется это объявление. Это означает, что когда разработчик в другом файле использует класс, который где-то у себя имеет объявление strict_type, это не спасет от переопределения примитивных данных в этом PHP-файле.

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

Написать комментарий