我试图理解为什么我不能在我的代码中执行此操作?
<?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)
兼容答案 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。