无法在 PHP 中的 Repository 实现中使用超类
Can't use superclass in Repository implementation in PHP
我正在尝试在 PHP 中实现非常基本的存储库模式。
假设我需要一个通用接口来处理通用实体存储:
<?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 class:
<?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 要求。那么为什么会抛出这个错误呢?
正如我所说,您正在寻找仿制药。现在不可能像 JAVA or C# it is however in HHVM
对于 PHP,rfc 仍处于草案状态。
https://wiki.php.net/rfc/generics
所以如果你真的想这样做,你要么创建一个更通用的接口,进行一些类型检查,要么使 Post
成为 Entity
的子类,或者同时成为另一个父类的子类(但这将生成严格警告)。
我正在尝试在 PHP 中实现非常基本的存储库模式。
假设我需要一个通用接口来处理通用实体存储:
<?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 class:
<?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 要求。那么为什么会抛出这个错误呢?
正如我所说,您正在寻找仿制药。现在不可能像 JAVA or C# it is however in HHVM
对于 PHP,rfc 仍处于草案状态。 https://wiki.php.net/rfc/generics
所以如果你真的想这样做,你要么创建一个更通用的接口,进行一些类型检查,要么使 Post
成为 Entity
的子类,或者同时成为另一个父类的子类(但这将生成严格警告)。