php获取接口参数类型,php – 在接口实现中覆盖参数类型

我们假设我有一个模型接口:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值