2017-04-03 9 views
3

私は次の構造を持っている: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

を? AffiliateBaseModelを継承します。
これを克服し、がsave関数呼び出しを処理する最善の方法を教えてください。方法で

おかげ

+3

'GenericRepository :: save'のメソッドシグネチャが満たされていないためです。このメソッドは 'BaseModel'を受け入れることができると言っていますが、' IAffiliateRepository :: save'は 'Affiliate'インスタンスしか受け付けません。それは明らかに契約を破る。 – enricog

+0

\ App \ Models \ Affiliateは\ App \ Models \ BaseModelの子孫ですか? – Imaginaroom

+0

* "なぜ?アフィリエイトは' BaseModel'から継承しています。 "* - PHPはC++ではないため,--( – axiac

答えて

1

ルック:

// GenericRepository 
public function save(BaseModel $model) 

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

両方のクラスが同じ型を期待しなければなりません。 GenericRepositoryクラスにIAffiliateRepositoryを実装すると、正しいことになります。変数名を同じにする必要があるかもしれません。

0

が少し厄介ようだが、問題は、IAffiliateRepositoryを実装するAffiliateRepositoryために、saveの署名がGenericRepository

save(Affiliate $affiliate) : int 

実装これを満たしていないなければなりません。

あなたはAffiliateRepositoryでこれを試みることができる...

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

@enricogはコメントで正しい答えを与えた:save方法がBaseModelある任意のオブジェクトを受け入れなければならないインタフェースを満たすために。 IAffiliateRepositoryによって提供される方法はそれを行いません。