Немного информации (1)

Строгая типизация была введена в 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. ввели типизированные свойства, что делает строгую типизацию еще строже :).

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

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

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

Практика

Что будет, если типы передаваемых аргументов в методе не совпадут при включенном strict_types ?

Экспериментируем тут: https://3v4l.org/2NQ8o#v8.1.19

<?php

declare(strict_types = 1);
// с включенной этой опцией будут fatal-errors ниже, без нее - все как в комментариях

class Foo 
{
    public function bar(int $a): int 
    {
        return $a * 2;
    }

    public function bar2(string $a): string
    {
        return $a . "2";
    }

    public function bar3(string $a): string
    {
        return strlen($a);
    }

}

$foo = new Foo();

// Strict: Fatal error: Uncaught TypeError: Foo::bar(): Argument #1 ($a) must be of type int, string given
echo $foo->bar("2");    // 4
echo "n";

// Strict: Fatal error: Uncaught TypeError: Foo::bar2(): Argument #1 ($a) must be of type string, int given
echo $foo->bar2(2);     // 22
echo "n";

// Strict:  Fatal error: Uncaught TypeError: Foo::bar3(): Return value must be of type string, int returned
echo $foo->bar3("asjdfasf");        // 8
echo "n";

Источники

(1) Строгая типизация в PHP https://sergeymukhin.com/blog/strogaya-tipizatsiya-php

Tags

Нет Ответов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Рубрики


Подпишись на новости
👋

Есть вопросы?