PHP (7.1) 继承问题



我有以下结构:

class AffiliateRepository extends GenericRepository implements IAffiliateRepository {
}

abstract class GenericRepository  {
    public function save(BaseModel $model) : int{
        $model->save();
        return $model->getId();
    }
}
interface IAffiliateRepository  {
    public function save(Affiliate $affiliate) : int;
}
public class Affiliate extends BaseModel{}

$affiliateRepository  = new AffiliateRepository();
$affiliateRepository->save(new Affiliate());

我希望GenericRepository注意保存操作。

但是我收到以下错误:

Declaration of AppServicesAffiliateRepository::save(AppModelsAffiliate $affiliate): int should be compatible with AppServicesGenericRepository::save(AppModelsBaseModel $model): int

为什么? Affiliate继承自BaseModel
克服这个问题并让GenericRepository处理save函数调用的最佳方法是什么。

谢谢

看方法:

// GenericRepository
public function save(BaseModel $model)
// IAffiliateRepository
public function save(Affiliate $affiliate) : int;

两个类必须期望相同的类型。如果在类中实现IAffiliateRepository GenericRepository则是正确的。您可能还需要将变量名称更改为相同。

看起来有点混乱,但问题是,为了让AffiliateRepository实现IAffiliateRepositorysave的签名必须是

save(Affiliate $affiliate) : int

GenericRepository 中的实现不能满足这一点。

您可以在AffiliateRepository中尝试此操作...

public function save(Affiliate $affiliate) : int {
    return parent::save($affiliate);
}
@enricog注释

中给出了正确的答案:为了满足接口,save方法必须接受任何BaseModel的对象。IAffiliateRepository提供的方法不会这样做。

最新更新