<?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
,
почему я не могу получить сообщение об ошибке?
Режим «Строгие типы» проверяет типы только в определенных точках кода; он не отслеживает все, что происходит с переменной.
В частности, он проверяет:
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'
Других решений пока нет …