2010-02-01 135 views

回答

5

随着decorator

class MyClassDecorator 
{ 
    protected $decoratedInstance; 

    public function __construct($decoratedInstance) 
    { 
     $this->decoratedInstance = $decoratedInstance; 
    } 

    public function methodNameInOriginalClass() 
    { 
     $this->decoratedInstance->methodIWantToRunBefore(); 
     $this->decoratedInstance->methodNameInOriginalClass(); 
     $this->decoratedInstance->methodIWantToRunAfter(); 
    } 

    public function __call($method, $args) 
    { 
     if (method_exists($this->decoratedInstance, $method)) { 
      return call_user_func_array(
       array($this->decoratedInstance, $method), 
       $args 
      ); 
     } 
    } 
} 

上述假设你要调用的方法是public$decoratedInstance

+0

完美无缺的作品,谢谢。 也加入这有助于: \t功能&__得到($ prop_name){ \t \t如果(isset($这个 - > originalClass - > $ prop_name)){ \t \t \t回$这个 - > originalClass - > $ prop_name; \t \t} else { \t \t \t return false; \t \t} \t} :P – 2010-02-01 12:02:21

+0

绝对没错,但为了简洁起见,我跳过它。 – Gordon 2010-02-01 12:09:03

1

你最好的选择是延长原来的类,并重写添加你的代码的方法。

class MyClass extends OriginalClass 
{ 
    public function originalMethod() 
    { 
     parent::originalMethod(); 

     // My code... 
    } 
} 

$myClass = new MyClass(); 
$myClass->originalMethod(); 
1
  • runkit:更换,重命名和删除用户定义的函数和类。
  • funcall:在调用指定的函数/方法之前或之后调用回调函数。
  • intercept:允许用户在调用指定函数或方法时调用用户空间函数。

不是说使用这些不一定是个好主意。