AnDeriensのブログ

個人的なブログです

PHPの抽象クラスで定義したタイプヒントは厳密

抽象クラスで定義したタイプヒントは、その子クラスで厳密に守られなければならない。 通常のクラスのタイプヒントだと、タイプヒントで指定したクラスの子クラスまで許容されるが、抽象クラスでは許容されない。

<?PHP

class Parents
{
    public function hello()
    {
        echo 'hello parent';
    }
}

class Child extends Parents
{
    public function hello()
    {
        echo 'hello child';
    }
}

abstract class Base
{
    abstract public function handle(Parents $a);
}

class Usecase_A extends Base
{
    public function handle(Parents $a)
    {
        $a->hello();     
    }
}

class Usecase_B extends Base
{
    public function handle(Child $a)
    {
        $a->hello();     
    }
}

$parent = new Parents;
$child  = new Child;

$u_a = new Usecase_A;
$u_b = new Usecase_B;

$u_a->handle($parent);
$u_b->handle($child);

出力

PHP Fatal error:  Declaration of Usecase_B::handle(Child $a) must be compatible with Base::handle(Parents $a) ...

考察はまた後日…。