2007年8月14日火曜日

PHPでself::でスタティックなメソッド呼び出すとサブクラスのメソッドは呼び出されない

小ネタですが、PHPでスタティックなメソッドを呼び出す時の話です。 PHPでは、「self::method();」という形式でstaticなメソッドを呼び出すことができます。これは文字通り、「self」すなわち自分のスタティックメソッドを呼び出すわけです。

class MyClass {
 static function name() {
  return 'Pichu';
 }
 function getName() {
  return self::name();
 }
}
class MySubClass extends MyClass {
 static function name() {
  return 'Pikachu';
 }
}
という定義をしているときに以下のようになります。
$myObject = new MySubClass();
echo $myObject->getName();
//結果は「Pichu」となる
あえていうまでのことではないといえば、その通りなのですが、スタティックなメソッドでも「$this->」と同様に親クラスから実装されているはずのサブクラスのスタティックメソッドを呼び出したい時もあると思うのです。 これを実現する方法は、これといって難しい方法ではないのですが可能です。
class MyClass {
 static function name() {
  return 'Pichu';
 }
 function getName() {
//  return self::name();
  eval('$name='.get_class($this).'::name();');
  return $name;
 }
}
と、いった具合になります。 コードは簡単なので特に説明は不要でしょう。