Найти в Дзене

Что такое declare(strict_types=1)?

PHP с каждым большим обновлением все больше стримится к строгой типизации. Так вначале пути нельзя было вообще указывать типы (было просто var), потом стало можно указывать типы у аргументов, но нельзя указывать возвращаемый тип. Потом добавили скалярные типы, nullable. Потом типы у свойств классов и так далее. Но несмотря на все это - PHP не является строго типизированным языком, что дает много свободы разработчикам. Директива declare(strict_types=1) показывает интерпретатору то, что в данном файле будет использоваться строгая типизация. Это так сказать "бьет по рукам" неграмотным разработчикам, выдавая ошибки при нарушении типизации. Рассмотрим пример: function printText(string $text ) {
echo $text;
} printText(1); // выведет 1 printText('Hello'); // выведет Hello Тут представлена обычная функция, которая принимает текст и выводит его. Если не объявлять строгую типизацию, то никаких ошибок не будет. Код спокойно выведет оба варианта, несмотря на то, что мы передали в первом варианте
Оглавление

PHP с каждым большим обновлением все больше стримится к строгой типизации. Так вначале пути нельзя было вообще указывать типы (было просто var), потом стало можно указывать типы у аргументов, но нельзя указывать возвращаемый тип. Потом добавили скалярные типы, nullable. Потом типы у свойств классов и так далее. Но несмотря на все это - PHP не является строго типизированным языком, что дает много свободы разработчикам. Директива declare(strict_types=1) показывает интерпретатору то, что в данном файле будет использоваться строгая типизация. Это так сказать "бьет по рукам" неграмотным разработчикам, выдавая ошибки при нарушении типизации.

Рассмотрим пример:

function printText(string $text ) {
echo $text;
}
printText(1); // выведет 1
printText('Hello'); // выведет Hello

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

Как только вначале файла мы добавляем declare(strict_types=1), то интерпретатор начинает предираться к подобным случаем. Итак в следующем примере при передаче числа мы получим ошибку о нарушении типизации.

Пример:

declare(strict_types=1);
function printText(string $text )
{
echo $text;
}
printText(1); // Fatal error: Uncaught TypeError: printText(): Argument #1 ($text) must be of type string, int given
printText('Hello'); // выведет Hello

Данный пример показывает лишь базовое представление. В данном случае не было бы критично, если бы строгая типизация не использовалась, а теперь представьте, что у вас есть функция, которая переводит строковое написание числа в само число. Тогда тут уже недопустимо передавать что-то кроме типа string. А в рабочих ситуациях есть еще более важные ситуации, когда необходимо строго соблюдать типизацию.

Но есть нюанс

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

Где объявлять declare(strict_types=1)?

Строгая типизация, как и любое, что объявляется в declare, всегда необходимо вызывать в самом начале файла. Сразу между <?php и namespace

Когда объявлять?

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

Какие преимущества?

  • Надежность - как было описано выше, бывают ситуации, в которых строгая типизация необходима и нарушать ее нельзя
  • Быстродействие - интерператор не будет тратить ресурсы на перевод в нужный тип данных под капотом
  • Чистота кода - хорошо типизированный код выглядит читабельнее и красивее