17


5

メソッドが存在する場合でもPHPで__call()をトリガーする

PHP documentationは、魔法のメソッド `+ __ call()+`について次のように述べています。

_ call()は、オブジェクトコンテキストでアクセスできないメソッドを呼び出すときにトリガーされます。 _ __

メソッドが存在する場合でも、実際のメソッドが呼び出される前に `+ __ call()+`を呼び出す方法はありますか? または、私が実装できる他のフック、またはこの機能を提供する別の方法はありますか

問題があれば、これは `+ static function `用です(実際には ` __ callStatic +`を使用することを好みます)。

2 Answer


21


すべてのメソッドを保護して__call()を使用して呼び出すだけでは不十分です。

class bar {public function __call($ method、$ args){echo "calling $ method"; //他のことをする//おそらくmethod_existsがチェックを返すcall_user_func_array(array($ this、$ method)、$ args);保護された関数foo($ arg){return $ arg;} }}

$ bar =新しいバー$ bar-> foo( "baz"); // echoの 'calling foo'を返し、 'baz'を返す


11


他のすべてのメソッドを保護し、__ callStaticを介してそれらをプロキシするだけではどうですか?

名前空間テスト\ foo;

クラスA {public static function __callStatic($ method、$ args){echo __METHOD__。 "\ n";

call_user_func_array(__ CLASS__を返します。 '::' $ method、$ args); }

保護された静的関数foo(){echo __METHOD__。 "\ n"; }}

A :: foo();