我试图为返回类 B 实例的类 A 和类 B 本身指定两个接口(interface)。
我在接口(interface)上声明返回类型。
假设我有两个接口(interface)。
某种 RepositoryInterface,它有一个 get()
方法,该方法返回实现 ElementInterface 的对象
<?php
namespace App\Contracts;
interface RepositoryInterface {
public function get( $key ) : ElementInterface;
}
还有一个元素界面:
<?php
namespace App\Contracts;
interface ElementInterface { }
现在,我的存储库实现声明了一个返回类型,它是特定类 MyElement
。
<?php
namespace App\Repositories;
class MyRepository implements RepositoryInterface {
public function get( $key ) : MyElement {
// ...
}
}
其中MyElement
是一些实现ElementInterface
的类。
...这会导致 fatal error :
Declaration of MyRepository::get( $key ): MyElement must be compatible with RepositoryInterface::get( $key ): ElementInterface
如果我不在接口(interface)上指定返回类型,这将工作得很好。然而,我想限制任何实现 RepositoryInterface 的类返回的类的类型。
- 这在 PHP 7.1 中是不可能的吗?
- 如果这确实不可能,是因为我的模式不正确吗?
- 如何声明接口(interface)方法的返回类型而不指定该类型的实际实现。
最佳答案
对于任何低于 7.4 的 PHP 版本,这是不可能的。
如果您的界面包含:
public function get( $key ) : ElementInterface;
那么你的类(class)需要是:
class MyRepository implements RepositoryInterface {
public function get( $key ) : ElementInterface {
returns new MyElement();
// which in turn implements ElementInterface
}
}
实现接口(interface)的类的声明必须完全匹配接口(interface)制定的契约。
通过声明它必须返回特定的接口(interface)而不是特定的实现,您可以为如何实现它提供回旋余地(现在您可以返回 MyElement
或 AnotherElement
只要两者都实现了 ElementInterface
);但方法声明无论如何都必须相同。
查看它的工作情况 here .
从 PHP 7.4 开始,将于 2019 年 11 月发布,covariance will be supported for return types 。到那时,这就可以了。
关于php - 缩小已实现方法的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49352636/