如果您只需要訪問類的公共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,你必須使用繼承。如果您需要訪問private
API,則必須修改類文件。儘管繼承方式沒問題,但修改類文件可能會在更新時遇到問題(您將失去所有修補程序)。但兩者比使用runkit更可行。
「頑強PHP」? – Artefacto 2010-06-10 05:47:17
正在編輯類源代碼的一個選項? – 2010-06-10 05:48:00
標題有誤導性; 「延長」是指繼承。我已經改變它來更好地反映你的問題。 – Artefacto 2010-06-10 05:53:11