问题描述
我原以为以下内容会产生类型错误,因为 123
是整数而不是字符串,所以向需要字符串的函数提供整数是否可以?
foo(123);
function foo(string $str) {
...
}
解决方法
是的,因为整数可以转换为字符串(例如数组不能)。
是的,除非您声明 declare(strict_types=1)
。
foo(123);
function foo(string $str) {
var_dump($str); // string(3) "123"
}
但以下内容:
declare(strict_types=1);
function foo(string $str) { }
foo(123); // FAIL (Uncaught TypeError)
会抛出:
致命错误:Uncaught TypeError: foo(): Argument #1 ($str) must be of type string,int given
,PHP manual 非常具体地说明了这种行为,并直接说明了您提出的示例:
默认情况下,如果可能,PHP 会将错误类型的值强制转换为预期的标量类型声明。例如,一个函数为一个需要字符串的参数提供一个 int 值,将得到一个字符串类型的变量。
这是否“OK”(如您所问)高度依赖于实现。