抽象クラスで定義したタイプヒントは、その子クラスで厳密に守られなければならない。 通常のクラスのタイプヒントだと、タイプヒントで指定したクラスの子クラスまで許容されるが、抽象クラスでは許容されない。
<?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) ...
考察はまた後日…。