0

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

4

1 に答える 1