18

PHPのドキュメントには、__call()マジック メソッドについて次のように記載されています。

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

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

それが重要な場合、これは a 用ですstatic function(実際には を使用したいと思います__callStatic)。

4

2 に答える 2

22

すべてのメソッドを保護し、__call() を使用して呼び出してみませんか?

 class bar{
    public function __call($method, $args){
        echo "calling $method";
        //do other stuff
        //possibly do method_exists check
        return call_user_func_array(array($this, $method), $args);
    }
    protected function foo($arg){
       return $arg;
    }
 }

$bar = new bar;
$bar->foo("baz"); //echo's 'calling foo' and returns 'baz'
于 2009-07-02T10:08:46.427 に答える
11

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

namespace test\foo;

class A
{
    public static function __callStatic($method, $args)
    {
        echo __METHOD__ . "\n";

        return call_user_func_array(__CLASS__ . '::' . $method, $args);
    }

    protected static function foo()
    {
        echo __METHOD__ . "\n";
    }
}

A::foo();
于 2009-07-02T09:52:26.960 に答える