我有以下结构:
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
实现IAffiliateRepository
,save
的签名必须是
save(Affiliate $affiliate) : int
GenericRepository
中的实现不能满足这一点。
您可以在AffiliateRepository
中尝试此操作...
public function save(Affiliate $affiliate) : int {
return parent::save($affiliate);
}
中给出了正确的答案:为了满足接口,save
方法必须接受任何BaseModel
的对象。IAffiliateRepository
提供的方法不会这样做。