Bonjour, étant en train de rédiger un rapport (dans le cadre de mes
études) sur un framework "maison" écrit en PHP j'apprécierai un coup de
main à propos d'un point de notions :
Imaginons une classe torchon, une classe serviette et une classe
corbeille.
Chacune de ces trois classes implémente une fonction traite()
Aucun de ces classes ne dérive d'une classe ancêtre implémentant la
fonction traite()
la classe corbeille dispose d'un tableau dans lequel on peut ajouter des
instances de classes, puis par la suite parcourir ce tableau et appeller
traite() pour chacun des éléments.
Ce qui donnerai en pseudoPHP :
$corbeille = new corbeille();
$un_torchon = new torchon("ID_acarreau");
$une_serviette = new serviette("ID_deplage");
// Voire même $corbeille->ajoute($un_torchon,$une_serviette,$encore_un,
$et_un_autre)
Puis dans la fonction corbeille::traite()
{
foreach($this->objects as $obj)
{
$obj->traite();
}
}
Bon... Quelle est ma question ? est-ce du polymorphisme ? Normalement,
dans un autre langage objet (C++ ou JAVA), ce serait le cas à condition
que les classes serviette et torchon héritent d'une classe commune
(éventuellement abtraite), appellons la baseObject et implémentant traite
()
Ensuite, le conteneur (le tableau) serait un déclaré comme conteneur
d'instances de baseObject.
Le fait que PHP soit un langage non typé offre une grande liberté
d'écriture et la présence (ou pas) de traite() sur $obj->traite() sera
vérifiée à l'exécution et non pas à la compilation.
Je reformule encore ma question :
1) Est-ce bien du polymorphisme ?
2) Le fait que PHP soit non typé :
a) pousse-t-il le polymorphisme encore plus loin ?
b) les deux points (non typage / polymorphisme) n'ont aucun
rapport, c'est moi qui mélange tout.
Merci de me donner votre avis (concis s'il vous plait je suis pas trop un
théoricien des langages, j'ai souvent du mal à suivre) afin que je puisse
éviter de raconter des bobardises grosses comme un paquebot !
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
loufoque
Zouplaz a dit le 18/08/2004 14:21:
1) Est-ce bien du polymorphisme ? Non.
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ? b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout. Aucun des deux.
Le fait que PHP soit non typé freine le polymorphisme.
Enfin en fait, ça dépend de comment on voit ça.
Zouplaz a dit le 18/08/2004 14:21:
1) Est-ce bien du polymorphisme ?
Non.
2) Le fait que PHP soit non typé :
a) pousse-t-il le polymorphisme encore plus loin ?
b) les deux points (non typage / polymorphisme) n'ont aucun
rapport, c'est moi qui mélange tout.
Aucun des deux.
Le fait que PHP soit non typé freine le polymorphisme.
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ? b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout. Aucun des deux.
Le fait que PHP soit non typé freine le polymorphisme.
Enfin en fait, ça dépend de comment on voit ça.
Frederic BISSON
1) Est-ce bien du polymorphisme ? Je dirais non.
Il n'existe aucun lien physique entre la classe "torchon" et la classe "serviette" et la présence de la méthode "traite" dans l'une ou l'autre classe n'est qu'une "coïncidence".
En PHP4, tu es obligé de créer une classe standard mais vide pour imiter les classes abstraites. En PHP5, tu as la possibilité de créer une classe abstraite. Dans l'un ou l'autre de ces cas, on parlera de polymorphisme.
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ? b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout. Le fait que tu puisses utiliser le typage faible pour imiter le
polymorphisme n'est qu'une conséquence. Attention, il ne s'agit pas d'un non typage mais d'un typage faible : PHP est parfaitement capable de te donner la classe ou le type de n'importe quelle variable.
@+
Frédéric BISSON
1) Est-ce bien du polymorphisme ?
Je dirais non.
Il n'existe aucun lien physique entre la classe "torchon" et la classe
"serviette" et la présence de la méthode "traite" dans l'une ou l'autre
classe n'est qu'une "coïncidence".
En PHP4, tu es obligé de créer une classe standard mais vide pour imiter
les classes abstraites. En PHP5, tu as la possibilité de créer une
classe abstraite. Dans l'un ou l'autre de ces cas, on parlera de
polymorphisme.
2) Le fait que PHP soit non typé :
a) pousse-t-il le polymorphisme encore plus loin ? b) les deux
points (non typage / polymorphisme) n'ont aucun
rapport, c'est moi qui mélange tout.
Le fait que tu puisses utiliser le typage faible pour imiter le
polymorphisme n'est qu'une conséquence. Attention, il ne s'agit pas d'un
non typage mais d'un typage faible : PHP est parfaitement capable de te
donner la classe ou le type de n'importe quelle variable.
Il n'existe aucun lien physique entre la classe "torchon" et la classe "serviette" et la présence de la méthode "traite" dans l'une ou l'autre classe n'est qu'une "coïncidence".
En PHP4, tu es obligé de créer une classe standard mais vide pour imiter les classes abstraites. En PHP5, tu as la possibilité de créer une classe abstraite. Dans l'un ou l'autre de ces cas, on parlera de polymorphisme.
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ? b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout. Le fait que tu puisses utiliser le typage faible pour imiter le
polymorphisme n'est qu'une conséquence. Attention, il ne s'agit pas d'un non typage mais d'un typage faible : PHP est parfaitement capable de te donner la classe ou le type de n'importe quelle variable.
@+
Frédéric BISSON
Bruno Desthuilliers
Zouplaz wrote:
Bonjour, étant en train de rédiger un rapport (dans le cadre de mes études) sur un framework "maison" écrit en PHP j'apprécierai un coup de main à propos d'un point de notions :
Imaginons une classe torchon, une classe serviette et une classe corbeille. Chacune de ces trois classes implémente une fonction traite()
Aucun de ces classes ne dérive d'une classe ancêtre implémentant la fonction traite()
la classe corbeille dispose d'un tableau dans lequel on peut ajouter des instances de classes, puis par la suite parcourir ce tableau et appeller traite() pour chacun des éléments.
Ce qui donnerai en pseudoPHP :
$corbeille = new corbeille(); $un_torchon = new torchon("ID_acarreau"); $une_serviette = new serviette("ID_deplage");
// Voire même $corbeille->ajoute($un_torchon,$une_serviette,$encore_un, $et_un_autre)
Puis dans la fonction corbeille::traite() { foreach($this->objects as $obj) { $obj->traite(); } }
Bon... Quelle est ma question ? est-ce du polymorphisme ?
Oui
Normalement, dans un autre langage objet (C++ ou JAVA), ce serait le cas à condition que les classes serviette et torchon héritent d'une classe commune (éventuellement abtraite), appellons la baseObject et implémentant traite ()
Le fait que dans des langages comme C++, Java, etc, les classes torchon, serviette et corbeille doivent dériver d'une même classe ou implémenter une même 'Interface' (au sens Java...) est une abberation due au typage statique psycho-rigide de ces langages, rien d'autre. Ce n'est d'ailleurs pas un hasard si la majorité des langages objets sont dynamiques (Smalltalk, CLOS, Python, Ruby, Javascript, Io, etc...), 'mixtes' (Objective C) ou avec inférence de type (OCaml...).
Le fait que PHP soit un langage non typé offre une grande liberté d'écriture et la présence (ou pas) de traite() sur $obj->traite() sera vérifiée à l'exécution et non pas à la compilation.
Exactement. Une appellation courante est 'typage canard' : si ça marche comme un canard et que ça cancanne comme un canard, c'est probablement un canard (ou quelque chose de suffisamment semblable à un canard pour qu'on puisse faire comme si c'en était un...)
Je reformule encore ma question :
1) Est-ce bien du polymorphisme ? Oui, définitivement.
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ?
Donne plus de souplesse et évite plein de code inutile.
b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout.
Il y a bien un rapport entre typage et polymorphisme : tes classes implémentent, dans la pratique, une même interface, ce qui fait qu'elles sont toutes les trois du type "qu'on peut leur envoyer le message 'traite()'"
Dans un langage à typage statique psycho-rigide, il faut explicitement dériver d'une même classe de base pour mettre en oeuvre le polymorphisme, ce qui est bien sûr une sévère limitation.
BTW, ta question serait plus à sa place sur f.c.objet (xpost et fu2 positionné)
Bruno
Zouplaz wrote:
Bonjour, étant en train de rédiger un rapport (dans le cadre de mes
études) sur un framework "maison" écrit en PHP j'apprécierai un coup de
main à propos d'un point de notions :
Imaginons une classe torchon, une classe serviette et une classe
corbeille.
Chacune de ces trois classes implémente une fonction traite()
Aucun de ces classes ne dérive d'une classe ancêtre implémentant la
fonction traite()
la classe corbeille dispose d'un tableau dans lequel on peut ajouter des
instances de classes, puis par la suite parcourir ce tableau et appeller
traite() pour chacun des éléments.
Ce qui donnerai en pseudoPHP :
$corbeille = new corbeille();
$un_torchon = new torchon("ID_acarreau");
$une_serviette = new serviette("ID_deplage");
// Voire même $corbeille->ajoute($un_torchon,$une_serviette,$encore_un,
$et_un_autre)
Puis dans la fonction corbeille::traite()
{
foreach($this->objects as $obj)
{
$obj->traite();
}
}
Bon... Quelle est ma question ? est-ce du polymorphisme ?
Oui
Normalement,
dans un autre langage objet (C++ ou JAVA), ce serait le cas à condition
que les classes serviette et torchon héritent d'une classe commune
(éventuellement abtraite), appellons la baseObject et implémentant traite
()
Le fait que dans des langages comme C++, Java, etc, les classes torchon,
serviette et corbeille doivent dériver d'une même classe ou implémenter
une même 'Interface' (au sens Java...) est une abberation due au typage
statique psycho-rigide de ces langages, rien d'autre. Ce n'est
d'ailleurs pas un hasard si la majorité des langages objets sont
dynamiques (Smalltalk, CLOS, Python, Ruby, Javascript, Io, etc...),
'mixtes' (Objective C) ou avec inférence de type (OCaml...).
Le fait que PHP soit un langage non typé offre une grande liberté
d'écriture et la présence (ou pas) de traite() sur $obj->traite() sera
vérifiée à l'exécution et non pas à la compilation.
Exactement. Une appellation courante est 'typage canard' : si ça marche
comme un canard et que ça cancanne comme un canard, c'est probablement
un canard (ou quelque chose de suffisamment semblable à un canard pour
qu'on puisse faire comme si c'en était un...)
Je reformule encore ma question :
1) Est-ce bien du polymorphisme ?
Oui, définitivement.
2) Le fait que PHP soit non typé :
a) pousse-t-il le polymorphisme encore plus loin ?
Donne plus de souplesse et évite plein de code inutile.
b) les deux points (non typage / polymorphisme) n'ont aucun
rapport, c'est moi qui mélange tout.
Il y a bien un rapport entre typage et polymorphisme : tes classes
implémentent, dans la pratique, une même interface, ce qui fait qu'elles
sont toutes les trois du type "qu'on peut leur envoyer le message
'traite()'"
Dans un langage à typage statique psycho-rigide, il faut explicitement
dériver d'une même classe de base pour mettre en oeuvre le
polymorphisme, ce qui est bien sûr une sévère limitation.
BTW, ta question serait plus à sa place sur f.c.objet (xpost et fu2
positionné)
Bonjour, étant en train de rédiger un rapport (dans le cadre de mes études) sur un framework "maison" écrit en PHP j'apprécierai un coup de main à propos d'un point de notions :
Imaginons une classe torchon, une classe serviette et une classe corbeille. Chacune de ces trois classes implémente une fonction traite()
Aucun de ces classes ne dérive d'une classe ancêtre implémentant la fonction traite()
la classe corbeille dispose d'un tableau dans lequel on peut ajouter des instances de classes, puis par la suite parcourir ce tableau et appeller traite() pour chacun des éléments.
Ce qui donnerai en pseudoPHP :
$corbeille = new corbeille(); $un_torchon = new torchon("ID_acarreau"); $une_serviette = new serviette("ID_deplage");
// Voire même $corbeille->ajoute($un_torchon,$une_serviette,$encore_un, $et_un_autre)
Puis dans la fonction corbeille::traite() { foreach($this->objects as $obj) { $obj->traite(); } }
Bon... Quelle est ma question ? est-ce du polymorphisme ?
Oui
Normalement, dans un autre langage objet (C++ ou JAVA), ce serait le cas à condition que les classes serviette et torchon héritent d'une classe commune (éventuellement abtraite), appellons la baseObject et implémentant traite ()
Le fait que dans des langages comme C++, Java, etc, les classes torchon, serviette et corbeille doivent dériver d'une même classe ou implémenter une même 'Interface' (au sens Java...) est une abberation due au typage statique psycho-rigide de ces langages, rien d'autre. Ce n'est d'ailleurs pas un hasard si la majorité des langages objets sont dynamiques (Smalltalk, CLOS, Python, Ruby, Javascript, Io, etc...), 'mixtes' (Objective C) ou avec inférence de type (OCaml...).
Le fait que PHP soit un langage non typé offre une grande liberté d'écriture et la présence (ou pas) de traite() sur $obj->traite() sera vérifiée à l'exécution et non pas à la compilation.
Exactement. Une appellation courante est 'typage canard' : si ça marche comme un canard et que ça cancanne comme un canard, c'est probablement un canard (ou quelque chose de suffisamment semblable à un canard pour qu'on puisse faire comme si c'en était un...)
Je reformule encore ma question :
1) Est-ce bien du polymorphisme ? Oui, définitivement.
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ?
Donne plus de souplesse et évite plein de code inutile.
b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout.
Il y a bien un rapport entre typage et polymorphisme : tes classes implémentent, dans la pratique, une même interface, ce qui fait qu'elles sont toutes les trois du type "qu'on peut leur envoyer le message 'traite()'"
Dans un langage à typage statique psycho-rigide, il faut explicitement dériver d'une même classe de base pour mettre en oeuvre le polymorphisme, ce qui est bien sûr une sévère limitation.
BTW, ta question serait plus à sa place sur f.c.objet (xpost et fu2 positionné)
Bruno
Bruno Desthuilliers
Frederic BISSON wrote:
1) Est-ce bien du polymorphisme ?
Je dirais non.
Il n'existe aucun lien physique entre la classe "torchon" et la classe "serviette" et la présence de la méthode "traite" dans l'une ou l'autre classe n'est qu'une "coïncidence".
Manifestement non. L'intention est évidente (du moins pour moi...).
En PHP4, tu es obligé de créer une classe standard mais vide pour imiter les classes abstraites.
Ce qui est totalement inutile et n'est donc qu'une perte de temps.
En PHP5, tu as la possibilité de créer une classe abstraite. Dans l'un ou l'autre de ces cas, on parlera de polymorphisme.
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ? b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout.
Le fait que tu puisses utiliser le typage faible pour imiter le polymorphisme n'est qu'une conséquence.
Ce n'est pas une 'imitation'. Pour info, Smalltalk (qui reste AMHA la référence en matière de langage objet) est un langage dynamique...
<holy-war> Et en l'occurrence, la distinction n'est pas entre typage 'faible' ou 'fort', mais entre typage statique ou dynamique. </holy-war>
Bruno
Frederic BISSON wrote:
1) Est-ce bien du polymorphisme ?
Je dirais non.
Il n'existe aucun lien physique entre la classe "torchon" et la classe
"serviette" et la présence de la méthode "traite" dans l'une ou l'autre
classe n'est qu'une "coïncidence".
Manifestement non. L'intention est évidente (du moins pour moi...).
En PHP4, tu es obligé de créer une classe standard mais vide pour imiter
les classes abstraites.
Ce qui est totalement inutile et n'est donc qu'une perte de temps.
En PHP5, tu as la possibilité de créer une
classe abstraite. Dans l'un ou l'autre de ces cas, on parlera de
polymorphisme.
2) Le fait que PHP soit non typé :
a) pousse-t-il le polymorphisme encore plus loin ? b) les deux
points (non typage / polymorphisme) n'ont aucun
rapport, c'est moi qui mélange tout.
Le fait que tu puisses utiliser le typage faible pour imiter le
polymorphisme n'est qu'une conséquence.
Ce n'est pas une 'imitation'. Pour info, Smalltalk (qui reste AMHA la
référence en matière de langage objet) est un langage dynamique...
<holy-war>
Et en l'occurrence, la distinction n'est pas entre typage 'faible' ou
'fort', mais entre typage statique ou dynamique.
</holy-war>
Il n'existe aucun lien physique entre la classe "torchon" et la classe "serviette" et la présence de la méthode "traite" dans l'une ou l'autre classe n'est qu'une "coïncidence".
Manifestement non. L'intention est évidente (du moins pour moi...).
En PHP4, tu es obligé de créer une classe standard mais vide pour imiter les classes abstraites.
Ce qui est totalement inutile et n'est donc qu'une perte de temps.
En PHP5, tu as la possibilité de créer une classe abstraite. Dans l'un ou l'autre de ces cas, on parlera de polymorphisme.
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ? b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout.
Le fait que tu puisses utiliser le typage faible pour imiter le polymorphisme n'est qu'une conséquence.
Ce n'est pas une 'imitation'. Pour info, Smalltalk (qui reste AMHA la référence en matière de langage objet) est un langage dynamique...
<holy-war> Et en l'occurrence, la distinction n'est pas entre typage 'faible' ou 'fort', mais entre typage statique ou dynamique. </holy-war>
Bruno
Bruno Desthuilliers
loufoque wrote:
Zouplaz a dit le 18/08/2004 14:21:
1) Est-ce bien du polymorphisme ?
Non.
Pardon ?
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ? b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout.
Aucun des deux. Le fait que PHP soit non typé freine le polymorphisme.
Pardon ?
Enfin en fait, ça dépend de comment on voit ça.
Oui, en effet. Je veux bien que tu nous explique plus en détail comment tu vois ça - histoire de rire deux minutes...
loufoque wrote:
Zouplaz a dit le 18/08/2004 14:21:
1) Est-ce bien du polymorphisme ?
Non.
Pardon ?
2) Le fait que PHP soit non typé :
a) pousse-t-il le polymorphisme encore plus loin ?
b) les deux points (non typage / polymorphisme) n'ont aucun
rapport, c'est moi qui mélange tout.
Aucun des deux.
Le fait que PHP soit non typé freine le polymorphisme.
Pardon ?
Enfin en fait, ça dépend de comment on voit ça.
Oui, en effet. Je veux bien que tu nous explique plus en détail comment
tu vois ça - histoire de rire deux minutes...
2) Le fait que PHP soit non typé : a) pousse-t-il le polymorphisme encore plus loin ? b) les deux points (non typage / polymorphisme) n'ont aucun rapport, c'est moi qui mélange tout.
Aucun des deux. Le fait que PHP soit non typé freine le polymorphisme.
Pardon ?
Enfin en fait, ça dépend de comment on voit ça.
Oui, en effet. Je veux bien que tu nous explique plus en détail comment tu vois ça - histoire de rire deux minutes...