从子类返回容器类型

时间:2014-11-04 14:22:43

标签: php oop parent-child extend

我有一个我不想编辑的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方法在类之间切换。
  4. 像这样:

    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;
        }
    }
    

    还有更好的方法吗?

1 个答案:

答案 0 :(得分: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允许您在每次调用中使用扩展程序类。因此,您可以在具有链接功能的父类中使用其他方法时覆盖该函数。