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

时间:2017-08-02 17:53:11

标签: php typing

<?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)会打印错误,但不会输出错误消息。

如您所见,我在int($c)中添加了一个字符串($a+$b),并声明为strict_types=1

为什么我不能收到错误消息?

1 个答案:

答案 0 :(得分:2)

“严格类型”模式仅检查代码中特定点的类型;它不会跟踪变量发生的所有事情。

具体来说,它检查:

  • 如果签名中包含类型提示,则为函数指定的参数;这里你给两个int一个函数,期望两个int s,所以没有错误
  • 函数的返回值,如果签名中包含返回类型提示;这里没有类型提示,但是如果你有: 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'