Si sólo necesita acceder a la API pública de la clase, se puede utilizar un Decorator:
class SomeClassDecorator
{
protected $_instance;
public function myMethod() {
return strtoupper($this->_instance->someMethod());
}
public function __construct(SomeClass $instance) {
$this->_instance = $instance;
}
public function __call($method, $args) {
return call_user_func_array(array($this->_instance, $method), $args);
}
public function __get($key) {
return $this->_instance->$key;
}
public function __set($key, $val) {
return $this->_instance->$key = $val;
}
// can implement additional (magic) methods here ...
}
luego envolver la instancia de SomeClass:
$decorator = new SomeClassDecorator(new SomeClass);
$decorator->foo = 'bar'; // sets $foo in SomeClass instance
echo $decorator->foo; // returns 'bar'
echo $decorator->someMethod(); // forwards call to SomeClass instance
echo $decorator->myMethod(); // calls my custom methods in Decorator
Si se necesita tener acceso para la API protected
, debe usar la herencia. Si necesita acceder a la API private
, debe modificar los archivos de la clase. Si bien el enfoque de herencia está bien, la modificación de los archivos de clase puede ocasionar problemas al actualizar (perderá los parches realizados). Pero ambos son más factibles que usar runkit.
"PHP tenaz"? – Artefacto
¿Está editando el código fuente de clase una opción? –
El título fue engañoso; "extender" se refiere a la herencia. Lo he cambiado para reflejar mejor tu pregunta. – Artefacto