'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.

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


person Saturn    schedule 02.08.2017    source источник
comment
declare(strict_types=1); невозможно   -  person Anant Kumar Singh    schedule 02.08.2017
comment
@AlivetoDie, не могли бы вы объяснить мне, почему это невозможно?   -  person Saturn    schedule 02.08.2017
comment
уже указано в дублирующей ссылке: - stackoverflow.com/questions/37111470/   -  person Anant Kumar Singh    schedule 02.08.2017
comment
@AlivetoDie Я думаю, вы неправильно поняли вопрос, на который вы ссылались. Этот пользователь спрашивал, могут ли они автоматически включить эту директиву для всех файлов (чего вы не можете); включение его в начале одного файла - это именно то, что вы можете сделать, и код в этом вопросе совершенно действителен.   -  person IMSoP    schedule 11.08.2017


Ответы (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'
person IMSoP    schedule 11.08.2017
comment
Большое тебе спасибо. Теперь я понимаю это яснее. - person Saturn; 19.08.2017