2014-11-04 92 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允许您使用扩展类的每一个电话。因此,您可以在使用链接功能的父类中的其他方法时重写该函数。