オブジェクトのコードに実際に触れることなく、オブジェクト メソッドの結果を変更するコードを実行する方法を見つけようとしていました。私が思いついた1つの方法は、デコレータを使用することです:
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()
で置き換える必要がnew Decorator(new Test())
あり、これはまさに私が避けたいことです。たぶん、基本クラスで何かできるでしょうか?