Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[php4] Appel de la classe parente dans le constructeur

5 réponses
Avatar
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

5 réponses

Avatar
Pascal PONCET
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
Avatar
CrazyCat
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

Avatar
Olivier Miakinen
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.


Avatar
Pascal PONCET
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 !

Avatar
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).

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.