«strict_types = 1» не работает в функции

<?php
declare(strict_types=1);
$a = 1;
$b = 2;
function FunctionName(int $a, int $b)
{
$c = '10'; //string
return $a + $b + $c;
}
echo FunctionName($a, $b);
?>

Я ожидал FunctionName($a, $b) выведет ошибку, но не выведет сообщение об ошибке.

Как видите, я добавил строку ($c) к int ($a+$b) и объявил strict_types=1,

почему я не могу получить сообщение об ошибке?

0

Решение

Режим «Строгие типы» проверяет типы только в определенных точках кода; он не отслеживает все, что происходит с переменной.

В частности, он проверяет:

  • параметры, передаваемые функции, если подсказки типа включены в сигнатуру; здесь вы даете два intс функцией, ожидающей два intс, так что нет ошибки
  • возвращаемое значение функции, если подсказка возвращаемого типа включена в сигнатуру; здесь у вас нет подсказки типа, но если у вас был намек на : int, все равно не было бы ошибки, потому что результат $a + $b + $c действительно int,

Вот несколько примеров, которые делать дать ошибки:

declare(strict_types=1);
$a = '1';
$b = '2';
function FunctionName(int $a, int $b)
{
return $a + $b;
}
echo FunctionName($a, $b);
// TypeError: Argument 1 passed to FunctionName() must be of the type integer, string given

Или для обратной подсказки:

declare(strict_types=1);
$a = 1;
$b = 2;
function FunctionName(int $a, int $b): int
{
return $a . ' and ' . $b;
}
echo FunctionName($a, $b);
// TypeError: Return value of FunctionName() must be of the type integer, string returned

Обратите внимание, что во втором примере это не факт, что мы рассчитали $a . ' and ' . $b который выдает ошибку, это тот факт, что мы возвращенный эта строка, но мы обещали вернуть целое число. Следующее будет не дать ошибку:

declare(strict_types=1);
$a = 1;
$b = 2;
function FunctionName(int $a, int $b): int
{
return strlen( $a . ' and ' . $b );
}
echo FunctionName($a, $b);
// Outputs '7'
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]