Diğer tek yolu, genel bir "süper sınıfı" oluşturmak olacaktır ...
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;
}
}
Her zaman en iyi çözüm değil, ama bazı durumlarda böyle bir şey kullanmak için var olması mümkündür. Bu çalışma zamanında herhangi bir nesneye ve "geçersiz kılma" yöntemleri "eklemek" izin verir.
Daha iyi genel çözüm sadece bir çocuk sınıfta sınıfını genişletmek için ... Ama yukarıdaki "üst sınıf" bazı kullanımlarını var ...