[php4] Appel de la classe parente dans le constructeur
5 réponses
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()".
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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.
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
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
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()
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 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.
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.
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
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 !
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 !
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
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.
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.
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.