[php4] Appel de la classe parente dans le constructeur

Le
Pascal PONCET
Bonjour,

Soit une classe parente et une classe héritée :

<code>
class Machin {
// constructeur
function Machin( x ) {

}

}

class Truc extends Machin {
// constructeur
function Truc( x ) {
// appel du constructeur parent
$this->Machin( x );

}

}
</code>

Problème : si j'ai un nombre important de classes enfants et que je
change le nom de ma classe parente => je suis obligé de reprendre le
code de tous les constructeurs enfants.

Exemple : si "class Machin { }" devient "class Chose { }", le
constructeur de "class Truc { }" devra appeler "$this->Chose( x );"
au lieu de "$this->Machin( x );".

Question : y a-t-il un mot clé, genre "parent::__constructor( x )", qui
permette de ne pas reprendre le nom de la classe parente dans le
constructeur enfant ? (attention, je suis en php 4 !)

Précision : je n'ai pas trop envie de bidouiller avec "eval()" et
"get_parent_class()".

Merci, Pascal
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pascal PONCET
Le #61598
Wouah ! ou j'ai posé la colle de l'année, ou je me suis mal exprimé.
Alors, dans le doute, je reformule :

En php4, les classes prévoient le mot clé "parent" pour désigner la
classe parente sans utiliser son nom.
Comme précisé dans la doc, c'est très pratique si l'héritage change de
nom (http://www.php.net/manual/fr/keyword.parent.php).
La question est de savoir s'il existe un mot clé permettant de désigner
la fonction constructeur de la classe parente, toujours sans utiliser la
forme littérale, et pour les mêmes raisons.
Je n'ai rien trouvé dans la doc, ce qui me laisse a priori pessimiste,
mais je sais que certaines infos y sont quasi confidentielles.
De plus, l'un d'entre vous a peut-être trouvé une parade pour contourner
ce manque.

Merci de votre aide,
Pascal
CrazyCat
Le #61599
Pascal PONCET wrote:
Problème : si j'ai un nombre important de classes enfants et que je
change le nom de ma classe parente => je suis obligé de reprendre le
code de tous les constructeurs enfants.


je crois que tu peux effectivement utiliser parent::fonction()

http://www.manuelphp.com/php/keyword.parent.php

Olivier Miakinen
Le #61596
Le 16/04/2007 11:05, CrazyCat répondait à Pascal PONCET :

Problème : si j'ai un nombre important de classes enfants et que je
change le nom de ma classe parente => je suis obligé de reprendre le
code de tous les constructeurs enfants.


je crois que tu peux effectivement utiliser parent::fonction()

http://www.manuelphp.com/php/keyword.parent.php


Euh... sauf que le constructeur de la classe parente ne s'appelle pas
« fonction » mais qu'il porte le même nom que la classe.

Sinon, pour répondre à Pascal : si tu changes le nom d'une classe
parente, tu es déjà obligé de reprendre la déclaration des enfants,
ne serait-ce que pour le nom que tu mets derrière « extends ».
Alors modification pour modification, avec un bon éditeur de texte
tu peux bien changer les appels aux constructeurs dans la foulée.


Pascal PONCET
Le #61592
Sinon, pour répondre à Pascal : si tu changes le nom d'une classe
parente, tu es déjà obligé de reprendre la déclaration des enfants,
ne serait-ce que pour le nom que tu mets derrière « extends ».
Alors modification pour modification, avec un bon éditeur de texte
tu peux bien changer les appels aux constructeurs dans la foulée.


C'est pas faux, ce n'est peut être pas une fonctionnalité "essentielle".
Cela dit, j'ai vu dans les commentaires de php.net sur "parent::" que je
n'étais pas seul à m'être posé la question.
Par contre, les réponses proposées dans ces commentaires me conviennent
à moitié.
On peut en retenir deux tout de même :

1. Créer systématiquement, dans les classes parentes, une fonction
appelée "_constructeur" (par exemple) qui appelera le constructeur du
parent et qu'on pourra utiliser dans les classes enfant avec
parent::_constructeur().

2. Utiliser ces deux lignes de code dans le constructeur enfant :
$parent = get_parent_class();
parent::$parent();
Mais attention aux héritages en cascade avec cette dernière solution !

Olivier Miakinen
Le #61279

Alors modification pour modification, avec un bon éditeur de texte
tu peux bien changer les appels aux constructeurs dans la foulée.


C'est pas faux, ce n'est peut être pas une fonctionnalité "essentielle".


C'est le moins qu'on puisse dire. ;-)

Dans un langage compilé tel que le C++ la question ne se poserait même
pas (et ce d'autant plus qu'une classe peut avoir plusieurs « parents »
directs, mais c'est un autre problème).

1. Créer systématiquement, dans les classes parentes, une fonction
appelée "_constructeur" (par exemple) qui appelera le constructeur du
parent et qu'on pourra utiliser dans les classes enfant avec
parent::_constructeur().

2. Utiliser ces deux lignes de code dans le constructeur enfant :
$parent = get_parent_class();
parent::$parent();
Mais attention aux héritages en cascade avec cette dernière solution !


Tout ceci me semble très lourd alors que le nom de la classe parente est
forcément connu de façon statique. Je te propose une troisième solution.

3. Utiliser un préprocesseur pour remplacer partout un nom générique ou
une macro par le nom de la classe parent. Le préprocesseur peut être
cpp (avec des #define) ou tout simplement sed. Bien entendu, c'est
le fichier déjà « préprocessé » que tu mets en ligne.


Publicité
Poster une réponse
Anonyme