据我所知,php有能力防止在知道有问题的地方声明返回类型。
class Foo {
public function __clone(): Baz {
return new Baz;
}
}
class Baz {
}
$foo = new Foo;
$newFoo = clone $foo;
这会产生Fatal error: Clone method Foo::__clone() cannot declare a return type
,这是非常明智的。
但是那为什么PHP会允许这样的事情:
class Foo {
public function __toString(): float {
return "WAT!?!";
}
}
echo new Foo;
此结果导致
致命错误:未捕获的TypeError:Foo :: __ toString()的返回值必须是float类型,返回的字符串是
这没有意义,因为您要尝试返回浮点数:
致命错误:未捕获的错误:方法Foo :: __ toString()必须返回字符串值
对于PHP来说,阻止这些方法的声明的返回类型而不是给出那些可疑的错误会更有意义吗?如果不是,内部原因是什么?是否有一些机械障碍可以阻止php在clone这样的情况下可以做到这一点?
据我所知,php有能力防止在知道有问题的地方声明返回类型。类Foo {公共函数__clone():Baz {返回新的Baz; }} ...
TL; DR:要支持对魔术方法的合理类型推断,需要一种新的选择加入方式来肯定地禁用历史行为。 Hint:((new Foo)->__construct() instanceof Bar) === true
。