【PHP】インスタンスメソッドから自分の__callStaticを普通の方法で呼べない
PHPの謎
以下のQiitaの記事で完全に説明されてるけど、自分用にメモ 🗒
- PHPのオブジェクトから、自身のアクセス不能メソッドを静的コンテキストで呼び出せない件(追記あり) - Qiita
- 上の記事を受けてさらに調査してる記事→自分自身から__callStaticを呼び出したい - Qiita
結論としては、以下の条件を満たす場合(AND)、そのクラスの__callStatic
をマジックメソッドとして呼び出す方法がない
- そのクラスで
__call
が定義されている - 呼び出し元がそのクラスのオブジェクトメソッドである
- 呼び出す動的メソッドと同名のメソッドがprivate staticとして宣言されていない
対処方法は、汎用的には以下のように直接呼ぶ必要がある。
self::__callStatic('methodName', ['args']);
あとは、__call
として成立する条件、もしくは__callStatic
として成立する条件が判定できるなら、
以下のように__call
内でその条件をチェックして必要に応じて__callStatic
を呼んでやる、という手もある。
(こちらは記事には載ってない話)
public function __call($name, $args) { if ({`__callStatic`として成立する条件}) { return self::__callStatic($name, $args); } // 以下`__call`としての処理…… } ... // これなら普通に呼び出せる self::callMethodAsStatic('args');
(正直、自分で__call
と__callStatic
を実装してるなら、成立する条件を判定することは結構なケースで可能な気も………?)