8797 sujets

Développement web côté serveur, CMS

Bonjour à vous mon problème et pas tres compliqué mais je sais pas comment le résoudre...
Class Maman {
public function __construct() {
    $this->load();
}

public function load() {
    if (...) {
        /// du code
    } else {
        $this->loadDefault();  
    }
}

public function loadDefault() {
    //...
}
Class Fille extends Maman {
public function __construct() {
    parent::_construt();
    //...
}

public function loadDefault() {
    //...autre chose que Maman::loadDefault()
}


Quand je créé une instance de la classe Fille, la méthode Fille::loadDefault() et appellé dans la méthode Maman::load() (c'est le polymorphisme : liaison dynamique des méthodes)

Sauf que j'ai un membre de la classe mere qui n'est pas accessible depuis ma méthode surchargée Fille::loadDefault().

Dans Maman::load() j'initialise un membre privé (un DOMDocument en l'occurence) qui est utilisé dans loadDefault() que ce soit depuis la classe Maman ou Fille. SAuf que dans Fille, il me di que je fais appelle a un méthode qui n'existe pas (car je fais appelle a la méthode DOMDocument::createElement().

En débuggant à coup de var_dump() je me suis aperçu que jusqu'avant l'appelle de loadDefault() mon membre était bien initialisé. Sauf que des que je passe dans Fille::loadDefault().. l'initialisation a disparu comme si PIOUFFF!

Un idée sur le problème??
Modifié par MoOx (16 Apr 2007 - 10:05)
Salut,

Ce comportement est tout à fait normal. En effet, dans le concept d'héritage, les membres possèdant une visisbilité private ne sont accessibles que dans la classe possèdant cet attribut. Les classes filles n'y ont pas accès. Si tu souhaites que ton attribut soit accessible également par les classes filles, tu dois le délcarer en protected.

Voila un petit lien qui expliquera tout ca mieux que moi

Bonne continuation Smiley cligne
Modifié par ymhotepa (13 Apr 2007 - 17:26)
A vue de nez, il se peut qu'il y'ait une erreur dans ta condition if / else de ta méthode load car $this->loadDefault(); est apellé sous réserve d'une condition (...);

En initialisant $this->loadDefault(); dans ton constructeur, tout simplement, ça devrait aller mieux Smiley cligne


Class Maman {

    protected $_document = null;

    public function __construct() {
         $this->loadDefault();
    }

    public function load() {
       /// du code
    }

    public function loadDefault() {
        $this->_document = new DOMDocument();
        $this->_document->load('maman.xml');
    }

}

Class Fille extends Maman {

    public function loadDefault() {
        $this->_document = new DOMDocument();
        $this->_document->load('fille.xml');
    }

}



Et pourquoi pas plus simplement:


Class Maman {

    protected $_document = null;

    public function __construct() {
         $this->load();
    }

    public function load() {
        $this->_document = new DOMDocument();
        $this->_document->load('maman.xml');
    }

}

Class Fille extends Maman {

    public function load() {
        $this->_document = new DOMDocument();
        $this->_document->load('fille.xml');
    }

}




Aussi, petite précision, si tu utilises la forme statique Fille::load() , ton constructeur ne sera pas appelé. Dans ce cas il faut appeler la méthode loadDefault() dans la méthode Maman::load(); Et Bien sûr ne pas oublier de déclarer la variable membre du parent en protected...
Modifié par ilhooq (13 Apr 2007 - 20:43)
La 1ère réponse est la bonne je pense. Je testerais le protected lundi (au boulot Smiley smile ). Je connais bien l'héritage j'en ai bouffé une bonne partie de l'année (mais j'avais zappé complètement le protected ^^ )

Par contre la 2ème réponse n'a rien à voir. Mes appels s'effectuaient convenablement. Mes loadDefault() s'effectuent dans le cas où les fichiers n'existaient pas mais là n'est pas le problème.

Merci à vous Smiley biggrin
Modifié par MoOx (14 Apr 2007 - 13:49)