У меня есть следующая структура:
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
не делает этого