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 クラスは次のとおりです。
<?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 の要件を満たすことが保証されます。では、なぜこのエラーがスローされるのでしょうか?