我试图找到一种方法来执行一些代码来更改对象方法的结果,而无需实际接触对象的代码。我想出的一种方法是使用装饰器:
class Decorator {
private $object;
public function __construct($object) {
if (!is_object($object)) {
throw new Exception("Not an object");
}
$this->object = $object;
}
protected function doSomething(&$val) {
$val .= "!!";
}
public function __call($name, $arguments) {
$retVal = call_user_func_array(array($this->object, $name), $arguments);
$this->doSomething($retVal);
return $retVal;
}
}
class Test extends BaseTest {
public function run() {
return "Test->run()";
}
}
$o = new Decorator(new Test());
$o->run();
这样它就可以正常工作,但它有一个缺点,它现在对我来说无法使用 - 它需要用new Test()
with替换所有行,new Decorator(new Test())
这正是我想要避免的 - 大量干预现有代码。也许我可以在基类中做些什么?