在PHP中的Repository实现中不能使用超类

时间:2017-03-30 09:36:50

标签: php repository-pattern irepository

我试图在PHP中实现非常基本的Repository模式。

假设我需要一个通用接口来处理常见的实体存储:

<?php

interface IRepository
{
    public function persist(Entity $entity);
    // reduced code for brevity
}

现在我构建实体类型层次结构:

<?php

abstract class Entity
{
    protected $id;

    protected function getId()
    {
        return $this->id;
    }
}

这是Post类:

<?php

class Post extends Entity
{
    private $title;

    private $body;
}

现在我想使用PDO支持的数据库存储帖子:

<?php

use PDO;

abstract class DatabaseRepository implements IRepository
{
    protected $pdo;

    protected $statement;

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }
}

现在我尝试实现IRepository接口

<?php

class PostRepository extends DatabaseRepository
{

    // I have an error here 
    //  Fatal error: Declaration of PostRepository::persist(Post $post) must be compatible with IRepository::persist(Entity $entity) 
    public function persist(Post $post)
    {
    }
}

正如你所看到的,这会引发致命的错误。在PostRepository :: persist()中使用类型提示我保证我使用Entity子对象来满足IRepository的要求。那么为什么抛出这个错误呢?

1 个答案:

答案 0 :(得分:1)

正如我评论你正在寻找泛型。目前不可能像JAVAC#那样在HHVM

对于PHP,rfc仍处于草稿状态。 https://wiki.php.net/rfc/generics

因此,如果您真的想要这样做,您可以使用某种类型检查创建更通用的接口,或者使Post成为Entity的子类,或者同时创建另一个父类的子类(但是这会生成严格的警告)。