我正在处理现有类的包装函数。
<?php
class wrapper extends client {
public function __call($name,$args) {
var_dump($name);
var_dump($args);
}
}
$client = new wrapper();
$client->users()->foobar();
?>
我的回答是:
string(5) "users"
array(0) {
}
我的目标是记录函数调用和params。
我怎么能看到用户类上的函数foobar()被调用。而不仅仅是“用户”?有没有正确的方法来做到这一点?
答案 0 :(得分:0)
您要做的是实现装饰器模式,而不仅仅是扩展类。这很容易,因为我们已经使用了你已经使用过的魔法。但是你错过了包装类中的两个基本部分:
如果该类没有具有给定名称的methd,则只会调用神奇的 __ call 方法,因此您的扩展程序无效。所以你需要没有这些方法的Wrapper Decorator类。
样品:
class BetterWrapper {
protected $child;
public function __construct(){
$this->child = new Client();
}
public function __call($name,$args) {
var_dump($name);
var_dump($args);
return call_user_func_array(array($this->child, $name), $args);
}
}
试试这个。
请参阅此文档了解__call方法的机制:http://php.net/manual/en/language.oop5.overloading.php#object.call