我们假设我有一个模型接口:
interface Model
{
}
以及接收该模型作为参数的接口中的函数:
interface Service
{
public function add(Model $model);
}
为什么,当我用另一个实现上述功能的Model实现该服务时,如下所示:
class AnotherModel implements Model
{
}
class AnotherService implements Service
{
public function add(AnotherModel $model);
}
我收到此错误:
Fatal error: Declaration of AnotherService::add() must be compatible
with Service::add(Model $model)
解决方法:
扩展类或实现接口时,不允许对继承方法的任何类型或可见性约束比父类更严格.这意味着如果您在父级中有公共方法,则不允许将其设为受保护/私有.如果父方法接受某些特定类型的参数(在本例中为Model),则不允许将其接受的参数限制为某些更具体的类型.
这就是你在这里做的 – 你的Service :: add()接受Model类型的元素,但是AnotherService中的实现只接受AnotherModel类型的对象.这意味着即使您有另一个实现Model的类,例如“类YetAnotherModel实现Model”,AnotherService :: add()不接受它,因为YetAnotherModel不是AnotherModel的实例,即使它们实现了相同的接口.
因此,即使您实现了“我接受我的add()方法中的所有模型”的Service接口,AnotherService :: add()也不会接受YetAnotherModel类的对象.
标签:php,oop
来源: https://codeday.me/bug/20190724/1527327.html