PHPのオブジェクト上でのメソッド呼び出しをキャッチする方法

StackOverflow https://stackoverflow.com/questions/3241949

  •  15-09-2020
  •  | 
  •  

質問

PHPのオブジェクトに対して呼び出される方法をどのようにキャッチするかを把握しようとしています。私はMagic関数__callについて知っていますが、呼び出されたオブジェクトに存在しないメソッドのみがトリガされます。

たとえば私はこのようなものを持っています:

class Foo
{
  public function bar()
  {
    echo 'foobar';
  }

  public function override($method_name,$method_args)
  {
    echo 'Calling method ',$method_name,'<br />';
    $this->$method_name($method_args); //dirty, but working
  }
}
.

と私がこれを行うとき:

$foo = new Foo();
$foo->bar();
.

この出力が欲しい:

Calling method bar
foobar
.

これの代わりに:

foobar
.

これを行う方法は何ですか?助けてください:)

役に立ちましたか?

解決

あなたの元のFooの実装を取り入れることは、このようにdecoratorを包み込むことができます。

class Foo 
{
    public function bar() {
        echo 'foobar';
    }
}

class Decorator 
{
    protected $foo;

    public function __construct(Foo $foo) {
       $this->foo = $foo;
    }

    public function __call($method_name, $args) {
       echo 'Calling method ',$method_name,'<br />';
       return call_user_func_array(array($this->foo, $method_name), $args);
    }
}

$foo = new Decorator(new Foo());
$foo->bar();
.

他のヒント

オブジェクトの周囲にオブジェクトを折り返すことができ、呼び出しを元のオブジェクトに転送して結果を返すことができます。

オブジェクトをラッパークラスの変数として保存し、ラッパークラスのオーバーロードメソッドを使用して、オブジェクトを呼び出します/ set / checkを呼び出します。

$object = new AnyObject;
$object = new Wrapper($object);

$object->anyMethod();
$object->anyVar = 'test';
echo $object->anyVar;
echo $object['array form'];
.

フォービーチでラッパークラスをループすることはおそらく難しいです。それを試してみました。

機能をプライベートに設定した場合、コールは外部からの呼び出しを閉じ込めますが、__callに閉じ込められますが、内部から呼び出すことができます

class Foo
{
   private function bar()
   {
      echo 'foobar';
   }

   public function __call($method_name,$method_args)
   {
      echo 'Calling method ',$method_name,'<br />';
      $this->$method_name(); //dirty, but working
   }
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top