在此代码示例中,接口似乎并不关心实现方法foo()
是否仅检查类型为array
的{{1}}类型参数。 / p>
array
我希望至少出现致命的,不兼容的接口错误;但没有。
我的问题是:
答案 0 :(得分:4)
从7.2开始,这是预期的行为,并且接口类型提示在一定程度上得到了强制;但是实现类可以省略接口的类型声明(但不能声明与接口中声明的参数类型不同的参数类型)。
这是PHP 7.2上引入的更改。
如果您在PHP_VERSION_ID >= 7 && PHP_VERSION_ID < 7.2
的PHP中尝试此操作,则会得到:
致命错误:Bar :: foo($ foo)的声明必须与MyInterface :: foo(array $ foo)兼容
但是在PHP_VERSION_ID >= 7.2
上它“起作用”。 the changes is documented here的说明,并说:
参数类型扩展
来自重写方法和接口的参数类型 现在可以省略实现。这仍然符合 LSP,因为参数类型是互变的。
interface A { public function Test(array $input); } class B implements A { public function Test($input){} // type omitted for $input }
您可以省略参数类型,但不能声明不兼容的类型。
例如如果在您的示例中您尝试过:
public function foo(string $foo)
{
return $foo;
}
它会失败。
几个链接,供您进一步阅读有关此更改的信息: