Classes et porté de variable

TucSky Messages postés 32 Statut Membre -  
TucSky Messages postés 32 Statut Membre -
Bonjour !! :-)

Imaginons le problème suivant;
J'ai 2 classes :

 class core {

public $config = "Vide";
public function __construct() {
$this->config = "Configuration chargée";
echo 'Classe "core" > getConfig : "'.$this->getConfig().'"<br>';
$this->db = new db();
}
public function getConfig() {
return $this->config;
}
}
class db extends core {
public function __construct() {
echo 'Classe "db" > getConfig : "'.parent::getConfig().'"<br>';
}
}

Et lorsque j'initialise la classe core avec "$core = new core();", j'ai ceci en sortie :

Classe "core" > getConfig : "Configuration chargée"

Classe "db" > getConfig : "Vide"

Et mon problème si vous ne l'avez pas déjà vu, c'est que je ne parvient pas à récupérer la vrai valeur de $config. Depuis la classe db, quand je tente d'atteindre cette variable il me renvois la valeur définie lors de la déclaration de variable mais pas cette mise à jour par le __construct de "core"...

Je tien à dire que je débute en classe, object etc...

Merci d'avance

3 réponses

Utilisateur anonyme
 
Bonjour

Le manuel php est clair :
Les constructeurs parents ne sont pas appelés implicitement si la classe enfant définit un constructeur
Donc quand tu fais $this->db = new db();, le constructeur de db (enfant) est appelé sans que celui de core(parent) ne soit appelé. Donc $this->db->config vaut bien "Vide".
Note que si tu mets un appel explicite parent::__construct(); au début de db::construct(), tu tombes sur une succession sans fin d'appels emboîtés, ce qui m'amène à la remarque suivante :
Je m'interroge aussi sur la logique de la démarche : tu fais intervenir dans la définition d'une classe une autre classe qui dépend (et plus précisément descend) de la première ? Autrement dit, chacune des deux classes repose sur l'autre ?
0
TucSky Messages postés 32 Statut Membre 1
 
Merci d'avoir répondu :-)

La démarche :
Je définit une classe core, dont le constructeur ne devrais être appelé qu'une fois et à l'intérieur, je "charge" la classe db qui ELLE SEULE dépend de la classe core, autrement dit, je ne vois qu'une seule dépendance ici, les classes enfants (du type db) dépendent de la classe parent core.

Je n'avais pas connaissance de ce que disait le manuel PHP à propos des constructeurs de classe enfant, et en toute logique j'en ai pensé autrement...
Mais si je ne met pas de constructeur dans la classe enfant, la page n'a pas l'air de vouloir charger, je ne sais pas pourquoi O_O

Enfin, visiblement je m'y prend mal dans l'organisation des classes, si il ya d'autre moyen de passer des variables de la classe parent au sous classes (sans utiliser les paramètre constructeur) je suis preneur :D
0
TucSky Messages postés 32 Statut Membre 1
 
J'avais testé le coup de faire un parent::construct au début du constructeur enfant, bien-sur il a fallu que je change de place le " $this->db = new db();" et que je le place en dessous de "$core = new core();" (je trouvai ça plus pratique que les classes enfant soient initialisées dans le constructeur core) et la ça fonctionnai evidement sauf que du coup l'exemple du $this->config = "Configuration chargée"; ne prend plus...

En effet j'ai mis ça c'etait pour simplifier l'exemple, en réalité, je souhaite que la config se charge dans le constructeur core à l'aide d'un fichier config externe, donc un include.

Donc le script ressemblera à ça

http://pastebin.com/SZEKm4QQ

Mais c'est sale, je me demandai si il y avait une solution plus pratique et plus propre de le faire car là le config.php est rechargé à chaque initialisation de sous-classe.

(un include_once ne prend pas dans ce cas là)
0