覆盖非重写$ this引用的PHP类方法

时间:2010-09-21 00:42:16

标签: php oop methods subclassing

所以,我遇到了一些php OO的问题。我认为代码会解释得最好:

class foo {

    $someprop;

    public function __construct($id){
        $this->populate($id);
    }
    private function populate($id){
        global $db;
        // obviously not the call, but to illustrate the point:
        $items = $db->get_from_var1_by_var2(get_class($this),$id);
        while(list($k,$v) = each($items)){
            $this->setVar($k,$v);
        }
    }
    private function setVar($k,$v){
        // filter stuff, like convert JSON to arrays and such.
        $this->$k = $v;
    }
}

class bar extends foo {

    $otherprop;

    public function __construct($id){
        parent::__construct($id);
    }
    private function setVar($k,$v){
        // different filters than parent.
        $this->$k = $v;
    }
}

现在,假设我的foo表中有一些proppen,而我的bar表中有其他的prop,那么当我传入一个ID时,应该在我的对象上设置vars。

但是,出于某种原因,foo工作得很好,但是bar没有设置任何东西。

我的假设是它在$ this-> setVar()调用上分崩离析,并且调用了错误的setVar,但是如果get_class($ this)正在工作(它是),那么这不应该是$ bar,并通过关联,setVar()是$ bar方法?

任何人都会看到我遗失/做错的事情?

1 个答案:

答案 0 :(得分:3)

您不能覆盖子类中的私有方法。实现类只知道私有方法,甚至不是子类。

你可以这样做:

class foo {

    $someprop;

    public function __construct($id){
        $this->populate($id);
    }
    private function populate($id){
        global $db;
        // obviously not the call, but to illustrate the point:
        $items = $db->get_from_var1_by_var2(get_class($this),$id);
        while(list($k,$v) = each($items)){
            $this->setVar($k,$v);
        }
    }
    protected function setVar($k,$v){
        // filter stuff, like convert JSON to arrays and such.
        $this->$k = $v;
    }
}

class bar extends foo {

    $otherprop;

    public function __construct($id){
        parent::__construct($id);
    }
    protected function setVar($k,$v){
        // different filters than parent.
        $this->$k = $v;
    }
}