[PHP] 親クラスのstaticメソッドから子クラスでオーバーライドされたstaticメソッドを呼ぶ

スポンサーリンク

PHPでクラス内からstaticメソッドを呼ぶ方法として
self::foo();
のようにselfを使うことができますが、継承が絡むとselfは思い通り動いてくれないことがあります。

<?php

abstract class Base {
  abstract protected static function foo();

  public static function bar() {
    self::foo();
  }
}

class Sub extends Base {
  protected static function foo() {
    echo "Sub foo\n";
  }
}

Sub::bar();

このようにabstract staticメソッドfoo()を呼び出すことだけを決めたメソッドbar()を抽象親クラスで定義し、サブクラスでこのfoo()をオーバーライドすることでbar()が動くように実装すると

Fatal error: Uncaught Error: Cannot call abstract method Base::foo() in /**/abstract_static.php:7

というエラーが出ます。Base内で使われたselfはbar()が定義されたBaseを参照しており、自動的にサブクラスのfoo()を参照することはできません。

static::

これを解決してくれるのがstatic::です。

<?php

abstract class Base {
  abstract protected static function foo();

  public static function bar() {
    static::foo(); // ←ここを変える
  }
}

class Sub extends Base {
  protected static function foo() {
    echo "Sub foo\n";
  }
}

Sub::bar();

static::は呼び出した際のクラスを参照するようになっているので、これでちゃんと
Sub foo
と出力されます。

スポンサーリンク

シェアする

フォローする