Режим «Строгие типы» проверяет типы только в определенных точках кода; он не отслеживает все, что происходит с переменной.
В частности, проверяется:
- параметры, передаваемые функции, если в сигнатуру включены подсказки типа; здесь вы даете два
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'
person
IMSoP
schedule
11.08.2017
declare(strict_types=1);
невозможно - person Anant Kumar Singh   schedule 02.08.2017