Единственным другим способом было бы создание универсального "суперкласса" ...
class SuperClass {
protected $obj = null;
protected $overrides = array();
public function __construct($obj) {
if (!is_object($obj)) {
throw new InvalidArgumentException('Argument is not an object');
}
$this->obj = $obj;
}
public function __call($method, $args) {
$method = strtolower($method);
if (isset($this->overrides[$method])) {
array_unshift($args, $this);
return call_user_func_array($this->overrides[$method], $args);
} elseif (is_callable(array($this->obj, $method))) {
return call_user_func_array(array($this->obj, $method), $args);
} else {
throw new BadMethodCallException('Invalid Method Called');
}
}
public function __get($var) {
return isset($this->obj->$var) ? $this->obj->$var : null;
}
public function __set($var, $value) {
$this->obj->$var = $value;
}
public function addOverride($method, $callback) {
$this->overrides[strtolower($method)] = $callback;
}
}
Это не всегда лучшее решение, но возможно, что существуют ситуации, в которых можно использовать что-то подобное. Это позволит вам «добавлять» и «переопределять» методы к любому объекту во время выполнения.
Лучшее общее решение состоит в том, чтобы просто расширить класс в дочернем классе ... Но вышеупомянутый "суперкласс" действительно имеет некоторое применение ...