PHP(7.1)继承问题

时间:2017-04-03 06:30:32

标签: php inheritance php-7

我有以下结构:

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 个答案:

答案 0 :(得分:1)

查看方法:

Level

两个类都必须具有相同的类型。如果您将// GenericRepository public function save(BaseModel $model) // IAffiliateRepository public function save(Affiliate $affiliate) : int; 实施到IAffiliateRepository课程中,那就是正确的。您可能还需要将变量名称更改为相同。

答案 1 :(得分:0)

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

save(Affiliate $affiliate) : int

GenericRepository中的实现不符合此要求。

您可以在AffiliateRepository ...

中尝试此操作
public function save(Affiliate $affiliate) : int {
    return parent::save($affiliate);
}

答案 2 :(得分:0)

@enricog在评论中给出了正确的答案:为了满足界面,save方法必须接受任何BaseModel的对象。 IAffiliateRepository提供的方法不会这样做。