从子类返回容器的类型


return type of container from subclass

我有一个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;
    }
}

有更好的方法吗?

一种正确的方法是:

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可以在每次调用中使用扩展程序类。因此,您可以在使用具有链接功能的父类中的其他方法时重写该函数。