Строгая типизация в 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-файле.
То есть строгая типизация применяется к вызовам функций, сделанным изнутри файла с включенной строгой типизацией, а не к функциям, объявленным в этом файле.