Classes et porté de variable
TucSky
Messages postés
32
Statut
Membre
-
TucSky Messages postés 32 Statut Membre -
TucSky Messages postés 32 Statut Membre -
Bonjour !! :-)
Imaginons le problème suivant;
J'ai 2 classes :
Et lorsque j'initialise la classe core avec "$core = new core();", j'ai ceci en sortie :
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
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
A voir également:
- Classes et porté de variable
- Porte monnaie vinted - Guide
- Logiciel de classement de photos gratuit - Guide
- Impossible de créer le fichier de travail. vérifiez la variable d'environnement temp - Forum Microsoft Office
- Logiciel de classement de documents gratuit - Télécharger - Bureautique
- Variable d'environnement temp - Forum Word
3 réponses
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 ?
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 ?
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
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
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à)
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à)