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 вызов функции.

Спасибо

3

Решение

Посмотрите на методы:

// GenericRepository
public function save(BaseModel $model)

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

Оба класса должны ожидать того же типа. Если вы реализуете IAffiliateRepository в GenericRepository класс, это будет правильно. Вам также может понадобиться изменить имена переменных на одинаковые.

1

Другие решения

Кажется немного грязным, но проблема в том, чтобы AffiliateRepository реализовать IAffiliateRepositoryподпись save должно быть

save(Affiliate $affiliate) : int

Реализация в GenericRepository не удовлетворяет это.

Вы можете попробовать это в AffiliateRepository

public function save(Affiliate $affiliate) : int {
return parent::save($affiliate);
}
0

@enricog дал правильный ответ в комментарии: чтобы удовлетворить интерфейс save Метод должен принимать любой объект, который является BaseModel, Метод предоставлен IAffiliateRepository не делает этого

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector