PHP 26182 ~ 2 мин.

declare(strict_types=1) - Строгая типизация в PHP

declare(strict_types=1) - Строгая типизация в PHP

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

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

Немного информации

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

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

<?php

function getAge (string $age ) { 
    var_dump ($age); 
} 

$age = 33; 
getAge($age); 
// string (2) "33" 

Без строгой типизации PHP преобразовал целое число 33 в строку "33", что и следовало ожидать.

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

Как включить строгую типизацию в PHP?

В PHP 7 нам завезли директиву declare(strict_types=1);, которая как раз и включает строгий режим. В строгом режиме будет принята только переменная точного, заданного типа, или будет выброшен TypeError. Единственное исключение из этого правила состоит в том, что функция, ожидающая float, может давать целое число.

Итак, переделываем наш пример выше под строгую типизацию:

<?php
declare(strict_types = 1);

function getAge(string $age) {
 var_dump($age);
}

$age = 33;
getAge($age);

//Fatal error: Uncaught TypeError: Argument 1 passed to getAge() must be of the type string, integer given..

и ожидаемо получаем исключение TypeError.

<?php
declare(strict_types = 1);

function getFloat(float $f) {
    var_dump ($f);
}

$int = 666;
var_dump($int);
//int(666)

getFloat($int);
//float(666)
Следует учитывать, что включение режима строгой типизации также повлияет на объявления типов возвращаемых значений - при строгой типизации возвращаемое значение должно быть так же заданного типа, или так же будет выброшено исключение TypeError.


<?php
declare(strict_types = 1);

function getFloat(float $f) : int 
{
    return (int) $f;
}

$int = getFloat(100);

Директива declare(strict_types=1) должна быть вставлена в первой строке вашего кода, даже перед пространствами имен, соответственно после открытия <?php , иначе вылезет ошибка компиляции.

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

Строгая типизация определяется только для объявлений скалярного типа, поэтому не будет работать в PHP менее 7 версии, поскольку объявления скалярного типа были добавлены именно в этой версии. 

Что думаешь?

Андрей15.02.2023

Супер, спасибо!

Категории
  • PHP 65
  • Заметки 15
  • Безопасность 3
  • Флуд 2
  • Nginx 2
  • ИТ новости 2
  • Видео 1
  • Docker 1
  • Roadmap 1
  • Архитектура 0

Хочешь поддержать сайт?

Делаем из мухи слона

sergeymukhin.com

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

Релизы PHP 8.4

Дата Релиз
8 Июня 2024 Альфа 1
20 Июня 2024 Альфа 2
04 Июля 2024 Альфа 3
16 Июля 2024 Feature freeze
18 Июля 2024 Бета 1
01 Августа 2024 Бета 2
15 Августа 2024 Бета 3
29 Августа 2024 RC 1
12 Сентября 2024 RC 2
26 Сентября 2024 RC 3
10 Октября 2024 RC 4
24 Октября 2024 RC 5
07 Ноября 2024 RC 6
21 Ноября 2024 GA

Что нового?