PHP(7.1)的继承问题
问题描述:
我有以下结构: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 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
函数调用。
感谢
答
看方法:
// 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);
}
答
@enricog了在注释中正确答案:满足该接口的save
方法必须接受任何对象,它是一个BaseModel
。由IAffiliateRepository
提供的方法不会那样做。
由于不符合'GenericRepository :: save'的方法签名。该方法表示它可以接受任何'BaseModel',而'IAffiliateRepository :: save'只接受'Affiliate'实例。所以这显然违反了合同。 – enricog
Is \ App \ Models \ Affiliate是\ App \ Models \ BaseModel的后代吗? – Imaginaroom
*“为什么会这样?会员从'BaseModel'继承。”* - 因为PHP不是C++ :-( – axiac