'strict_types=1' 似乎在函数中不起作用

'strict_types=1' does not seem to work in a function

<?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)添加到一个整数($a+$b),并声明了strict_types=1

为什么我收不到错误信息?

"Strict types" 模式只检查代码中特定点的类型;它不会跟踪变量发生的所有事情。

具体来说,它检查:

  • 如果签名中包含类型提示,则提供给函数的参数;在这里你给了一个需要两个 ints 的函数两个 ints,所以没有错误
  • 函数的return值,如果签名中包含return类型提示;这里你没有类型提示,但是如果你有 : 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

或 return 提示:

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 的事实,而是我们 returned[=38= 的事实] 那个字符串,但我们的承诺是 return 一个整数。下面会报错:

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'