переопределение методов класса PHP, на которые ссылается не переопределенный $ this - PullRequest
1 голос
/ 21 сентября 2010

Итак, у меня проблемы с некоторыми вещами 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, это должно установить переменные для моего объекта при передаче идентификатора.

Но по какой-то причине foo работает отлично, но bar ничего не устанавливает.

Я предполагаю, что он разваливается при вызове $ this-> setVar () и вызывает неправильный setVar, но если get_class ($ this) работает (что есть), не должно ли $ this быть bar а по ассоциации setVar () будет методом $ bar?

Кто-нибудь видит что-то, что я пропускаю / делаю неправильно?

1 Ответ

3 голосов
/ 21 сентября 2010

Вы не можете переопределить закрытые методы в подклассах.Закрытый метод известен ТОЛЬКО классу реализации, даже подклассам.

Вы МОЖЕТЕ сделать это, хотя:

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