クラスの Public API にのみアクセスする必要がある場合は、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 ...
}
次に、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
protected
API にアクセスする必要がある場合は、継承を使用する必要があります。APIにアクセスする必要がある場合はprivate
、クラス ファイルを変更する必要があります。継承アプローチは問題ありませんが、クラス ファイルを変更すると、更新時に問題が発生する可能性があります (作成したパッチが失われます)。しかし、どちらも runkit を使用するよりも実行可能です。