Jeśli tylko mieć dostęp do publicznych API klasy, można użyć 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 ...
}
Następnie owinąć instancję 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
Jeśli chcesz mieć dostęp do API protected
, musisz użyć dziedziczenia. Jeśli potrzebujesz dostępu do interfejsu API private
, musisz zmodyfikować pliki klas. Chociaż podejście do dziedziczenia jest w porządku, modyfikowanie plików klas może spowodować problemy podczas aktualizacji (utracisz wszystkie wykonane poprawki). Ale oba są bardziej realne, niż przy użyciu runkita.
"wytrwały PHP"? – Artefacto
Czy edytowanie kodu źródłowego klasy stanowi opcję? –
Tytuł był mylący; "rozszerzenie" odnosi się do dziedziczenia. Zmieniłem go, by lepiej odzwierciedlał twoje pytanie. – Artefacto