遅延静的束縛と関連のあるお話です。クラスメソッドを呼び出す際に parent, self, static キーワードを使わず、クラス名を指定してやると呼び出し元がそのクラスになります。
<?php class A { public static function method() { echo __METHOD__, ' called by ', get_called_class(), PHP_EOL; } } class B extends A { public static function method() { echo __METHOD__, ' called by ', get_called_class(), PHP_EOL; return A::method(); // 遅延静的束縛のための情報は引き継がれない } } class C extends B { public static function method() { echo __METHOD__, ' called by ', get_called_class(), PHP_EOL; return parent::method(); } } C::method();
C::method called by C B::method called by C A::method called by A
forward_static_call() 及び forward_static_call_array() は遅延静的束縛の情報を残したままメソッドを呼び出すために(も?)用意されました。
<?php class A { public static function method() { echo __METHOD__, ' called by ', get_called_class(), PHP_EOL; } } class B extends A { public static function method() { echo __METHOD__, ' called by ', get_called_class(), PHP_EOL; return forward_static_call(array('A', 'method')); // 遅延静的束縛のための情報を引き継ぐ } } class C extends B { public static function method() { echo __METHOD__, ' called by ', get_called_class(), PHP_EOL; return parent::method(); } } C::method();
C::method called by C B::method called by C A::method called by C
継承関係にないクラスを指定しても引き継がれません。また親から子を指定しても引き継がれません。その他の制限として、クラススコープ以外で呼び出すと E_ERROR が発生します。後は call_user_func() 及び call_user_func_array() と使い方は同じのようです。
どんな場面で使うのかは、 どうなんだろう?