(DI)为什么我不能在我的PHP代码中执行此操作

时间:2017-02-12 14:49:16

标签: php dependency-injection

我试图理解为什么我不能在我的代码中执行此操作?

<?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会一直告诉我 “声明应与Model-&gt; insert(entity:\ Entity)

兼容

1 个答案:

答案 0 :(得分:1)

即使UserEntity在您更改方法签名时扩展了实体:

 protected static function insert( Entity $entity )

为:

protected static function insert( UserEntity $entity ) 

Model和UserModel不再兼容。你能做的就是这样:

protected static function insert(Entity $entity)
{
    if (!$entity instanceof UserEntity) {
        return \InvalidArgumentException('Entity must be a UserEntity');
    }
    ...
}

有些人可能会争辩说,通过要求子对象而不是定义的对象来打破合同会破坏接口隔离原则。在任何情况下,方法都不再匹配,因为您的方法表明它不再仅仅需要一个实体,因此可能不兼容。

编辑:目前有一项针对您要执行的操作的提案。它被称为Parameter Type Widening