遠き君へ

〜インターネットの最果てで自分語りを垂れ流したり垂れ流さなかったりするブログ〜

【PHP】インスタンスメソッドから自分の__callStaticを普通の方法で呼べない

PHPの謎

以下の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を実装してるなら、成立する条件を判定することは結構なケースで可能な気も………?)

background image is created by Niellyn & bhsav.