2010-09-21 10 views
1

Donc, j'ai des problèmes avec certains trucs php OO. Je pense que le code vous expliquera mieux:

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

Maintenant, en supposant que ma table foo a someprop en elle, et ma table de bar a otherprop en elle, cela devrait mettre les vars sur mon objet lorsque je passe une carte d'identité . Mais, pour une raison ou une autre, foo fonctionne parfaitement, mais la barre ne règle rien. Mon hypothèse est qu'elle est en train de s'effondrer sur l'appel de $ this-> setVar(), et d'appeler le mauvais setVar, mais si get_class ($ this) fonctionne (ce qui est le cas), cela ne devrait pas être $ this barre, et par association, setVar() soit la méthode $ bar?

Quelqu'un voit quelque chose qui me manque/mal?

Répondre

3

Vous ne pouvez pas remplacer les méthodes privées dans les sous-classes. Une méthode privée est connue de la classe d'implémentation UNIQUEMENT, pas même des sous-classes.

Vous pouvez le faire si:

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

Augh duhh! Merci! – Jesse

+0

@Jesse: Pas de soucis :) Indiquez cette réponse si vous voulez;) –