Discussion:
[php4] Appel de la classe parente dans le constructeur
(trop ancien pour répondre)
Pascal PONCET
2007-04-13 15:18:10 UTC
Permalink
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
Pascal PONCET
2007-04-16 09:05:55 UTC
Permalink
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
2007-04-16 09:05:55 UTC
Permalink
Post by 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
Olivier Miakinen
2007-04-16 10:14:05 UTC
Permalink
Post by CrazyCat
Post by 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
2007-04-16 12:36:26 UTC
Permalink
Post by Olivier Miakinen
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
2007-04-16 21:47:47 UTC
Permalink
Post by Pascal PONCET
Post by Olivier Miakinen
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).
Post by Pascal PONCET
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().
$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.

Continuer la lecture sur narkive:
Loading...