我试图在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的要求。那么为什么抛出这个错误呢?
答案 0 :(得分:1)
正如我评论你正在寻找泛型。目前不可能像JAVA或C#那样在HHVM
对于PHP,rfc仍处于草稿状态。 https://wiki.php.net/rfc/generics
因此,如果您真的想要这样做,您可以使用某种类型检查创建更通用的接口,或者使Post
成为Entity
的子类,或者同时创建另一个父类的子类(但是这会生成严格的警告)。