如何捕获 PHP 中对象的任何方法调用?
-
15-09-2020 - |
题
我试图弄清楚如何捕获 PHP 中对象调用的任何方法。我知道这个神奇的功能 __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();
其他提示
您可以将对象包装在对象周围,拦截任何调用,然后将它们转发到原始对象并返回结果。
只需将对象作为变量存储在包装类中,并在包装类中使用重载方法来调用/设置/获取/检查该对象。
$object = new AnyObject;
$object = new Wrapper($object);
$object->anyMethod();
$object->anyVar = 'test';
echo $object->anyVar;
echo $object['array form'];
在 foreach 中循环包装类可能更困难。没试过。
如果将函数设置为 private ,则 call 将捕获任何从外部对其进行的调用将被捕获在 __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
}
}
不隶属于 StackOverflow