1

所以,我遇到了一些 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 表中有 someprop,而我的 bar 表中有 otherprop,当我传入 ID 时,这应该在我的对象上设置 vars。

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

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

有人看到我缺少/做错了什么吗?

4

1 回答 1

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;
    }
}
于 2010-09-21T00:45:54.870 回答