スタティックメソッドのオーバーライド
スタティックメソッドのオーバーライドはできないので,がんばる時の方法.
単純に、
<?php abstract class A{ public static function read(){ self::onRead(); } abstract public static function onRead(); } class B extends A{ public static function onRead(){ echo "B"; } } B::read(); ?>
として、スタティックメソッドで多態性を使おうとしてもエラーで動かない。なぜなら、Bで継承されているスタティックメソッド、read()内で参照しているselfはBではなくAをさすからであり、A::onReadは実装されていないから怒られる。
これを実現するには次のようにする。
<?php abstract class A{ public static function read($class = __CLASS__){ $reader = new $class(); $reader->onRead(); } abstract public function onRead(); } class B extends A{ public static function read($class = __CLASS__){ parent::read($class); } public function onRead(){ echo "B"; } } class C extends A{ public static function read($class = __CLASS__){ parent::read($class); } public function onRead(){ echo "C"; } } B::read(); C::read(); ?>
上記例では、問題なく、BCと表示される。