2014-11-04 91 views
1

我有一個PHP庫,我不想編輯,並通過擴展/重寫某些方法來實現我的代碼。但我堅持可鏈接性。例如:從子類返回容器的類型

class MomentPHP extends Moment { 
    public $uniqueSettings; 
    public function formatJS(){ 
     return parent::format($this->uniqueSettings); 
    } 
} 

class Moment { 
    public function startOf(){ 
     //some code 
     return $this; 
    } 
} 

我想這樣做:

$momentphp = new MomentPHP(); 
$dateStart = $momentphp->startof('month')->formatJs(); 

而要做到這一點是壓倒在裏面MomentPHP子類的所有方法返回自己的方式。

有沒有其他簡單的方法來做到這一點?像使用_call什麼的?


編輯:找到一個方法來做到這一點:

  1. 卸下繼承,
  2. 創建父類的一個實例變量,
  3. 使用__call方法類之間切換。

像這樣:

class MomentPHP { 
    private $instance = null; 
    public $uniqueSettings; 

    public function __construct(){ 
     $this->instance = new Moment(); 
    } 

    public function __call($method,$args){ 
     if(in_array($method, get_class_methods($this))){ 
      call_user_func(array($this,$method),$args); 
     else 
      call_user_func(array($this->instance,$method),$args); 
     return $this; 
    } 

    public function formatJS(){ 
     return $this->instance->format($this->uniqueSettings); 
    } 
} 

class Moment { 
    public function startOf(){ 
     //some code 
     return $this; 
    } 
} 

有沒有什麼更好的辦法?要做到這一點

回答

0

一個正確的方法是:

class MomentPHP { 
    private $instance = null; 
    public $uniqueSettings; 

    public function __construct(){ 
     $this->instance = new Moment(); 
     // settings etc. 
    } 

    public function __call($method,$args){ 
     $result = NULL; 
     if(in_array($method, get_class_methods($this))){ 
      $result = call_user_func(array($this,$method),$args); 
     else 
      $result = call_user_func(array($this->instance,$method),$args); 
     if($result instanceof Moment) 
      $this->instance = $result; 
     return $this; 
    } 

    public function format(){ 
     return $this->instance->format($this->uniqueSettings); 
    } 
} 

更新從方法結果實例是按鍵操作,並使用$this代替$this->instance允許您使用擴展類的每一個電話。因此,您可以在使用鏈接功能的父類中的其他方法時重寫該函數。