Paradigm Shift Design

ISHITOYA Kentaro's blog.

スタティックメソッドのオーバーライド

スタティックメソッドのオーバーライドはできないので,がんばる時の方法.

単純に、

 <?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と表示される。