PHPクラス(v5.3.8)でこの奇妙な動作が見つかりました。あなたが持っている__callStatic()を非静的メソッドからトリガーする奇妙な動作
:
class foo {
function __call($func, $args) {
if ($func == 'bar')
echo "non-static __call";
}
static function __callStatic($func, $args) {
if ($func == 'bar')
echo "__callStatic";
}
function callMe() {
self::bar();
}
}
は、次に、あなたが実行します。
foo::bar() // outputs '__callStatic' as expected.
$f = new foo;
$f->callMe(); // outputs 'non-static __call', as I did not expect.
あなたが見る、非静的関数から呼び出さ存在しない静的メソッドは、__call()
代わりの__callStatic()
をトリガします。私はこれがこのように動作するはずか、これは何らかのバグですか?
[EDIT]
私はcallMe()
にstatic::bar();
をしようとするのを忘れたが、いや、それはどちらか動作しませんでした。
私はinhanのコメントを理解していますが、それでもなおインスタンスやオブジェクトではなくクラスそのものを呼び出すと、即座に論理が__callStatic()を起動する必要があると言います。しかたがない。
あなたの回答/コメントありがとうございます。
PHPには、これらの奇妙な振る舞いの巨大な山があります。:/マニュアルには、静的な*コンテキスト*でアクセスできないメソッドを呼び出すと__callStaticがトリガされると記載されています。確かにそれほど意味をなさない。それは全く直感的ではありません –
'callMe'は**非静的関数**です(オブジェクトスコープ内にあります)。存在しないメソッドを呼び出していても、オブジェクトインスタンス自体を扱っているので、 __call'が実行されます。 – inhan
しかし、それは変です。 'self :: bar();'を 'foo :: bar()'に変更すると、静的呼び出しであっても非静的に呼び出されます。 – webbiedave