我试图理解为什么我不能在我的代码中做到这一点?
<?php
Class Model
{
protected static function insert( Entity $entity )
{
# some codes to insert data in the database
}
}
<?php
Class UserModel extends Model
{
protected static function insert( UserEntity $entity )
{
parent::insert($entity);
}
}
基本上UserEntity也是一个实体,所以为什么PhpStorm一直告诉我。"声明应与模型>插入(实体:\实体(兼容
即使您将
方法签名从以下位置更改时,UserEntity 扩展了 Entity:
protected static function insert( Entity $entity )
自:
protected static function insert( UserEntity $entity )
模型和用户模型不再兼容。你可以做的是这样的:
protected static function insert(Entity $entity)
{
if (!$entity instanceof UserEntity) {
return InvalidArgumentException('Entity must be a UserEntity');
}
...
}
有些人可能会争辩说,通过要求子对象而不是定义的子对象来破坏契约会破坏接口隔离原则。在任何情况下,方法都不再匹配,因为正如您的方法所指示的那样,它不再需要仅一个实体,因此可能不兼容。
编辑:目前有一个关于您要做的事情的建议。它称为参数类型加宽。