具体的类应该遵循其界面的类型提示吗?

时间:2018-12-22 09:58:29

标签: php oop design-patterns interface

在此代码示例中,接口似乎并不关心实现方法foo()是否仅检查类型为array的{​​{1}}类型参数。 / p>

array

我希望至少出现致命的,不兼容的接口错误;但没有。

我的问题是:

  1. 这是预期的行为吗?
  2. 接口是否应该因为根本不被尊重而根本没有类型提示?

1 个答案:

答案 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;
}

它会失败。

几个链接,供您进一步阅读有关此更改的信息: