2010-02-01 156 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:允許用戶在調用指定函數或方法時調用用戶空間函數。

不是說使用這些不一定是個好主意。