我有以下结构:
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 App\Services\AffiliateRepository::save(App\Models\Affiliate $affiliate): int
should be compatible with
App\Services\GenericRepository::save(App\Models\BaseModel $model): int
为什么? Affiliate
继承自BaseModel
什么是解决这个问题的最佳方法,让GenericRepository
处理save
函数调用。
感谢
答案 0 :(得分:1)
查看方法:
Level
两个类都必须具有相同的类型。如果您将// GenericRepository
public function save(BaseModel $model)
// IAffiliateRepository
public function save(Affiliate $affiliate) : int;
实施到IAffiliateRepository
课程中,那就是正确的。您可能还需要将变量名称更改为相同。
答案 1 :(得分:0)
似乎有点混乱但问题是,为了AffiliateRepository
实施IAffiliateRepository
,save
的签名必须
save(Affiliate $affiliate) : int
GenericRepository
中的实现不符合此要求。
您可以在AffiliateRepository
...
public function save(Affiliate $affiliate) : int {
return parent::save($affiliate);
}
答案 2 :(得分:0)
@enricog在评论中给出了正确的答案:为了满足界面,save
方法必须接受任何BaseModel
的对象。 IAffiliateRepository
提供的方法不会这样做。