OVH Cloud OVH Cloud

PHP, typage faible et polymorphisme

5 réponses
Avatar
Zouplaz
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");

$corbeille->ajoute($un_torchon);
$corbeille->ajoute($une_serviette);

// 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 !

5 réponses

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

Avatar
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

Avatar
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");

$corbeille->ajoute($un_torchon);
$corbeille->ajoute($une_serviette);

// 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

Avatar
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


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