2017-04-03 85 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

这是为什么? Affiliate继承自BaseModel
什么是最好的方法来克服,并让GenericRepository处理save函数调用。

感谢

+3

由于不符合'GenericRepository :: save'的方法签名。该方法表示它可以接受任何'BaseModel',而'IAffiliateRepository :: save'只接受'Affiliate'实例。所以这显然违反了合同。 – enricog

+0

Is \ 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; 

两个类都有期待获得同样的类型。如果您将IAffiliateRepository转换为GenericRepository类,则它将是正确的。您可能还需要将变量名称更改为相同。

0

似乎有点混乱,但问题是,为了AffiliateRepository落实IAffiliateRepositorysave签名必须是

save(Affiliate $affiliate) : int 

GenericRepository实现并不满足这一点。

你可以在AffiliateRepository试试这个...

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

@enricog了在注释中正确答案:满足该接口的save方法必须接受任何对象,它是一个BaseModel。由IAffiliateRepository提供的方法不会那样做。