Polymorphisme de méthodes
Résolu
Noemie O'connor
Messages postés
78
Date d'inscription
Statut
Membre
Dernière intervention
-
JooS Messages postés 2468 Date d'inscription Statut Membre Dernière intervention -
JooS Messages postés 2468 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
J'utilise depuis peu le PhP et ne suis pas très familière avec ce langage. Existe t-il un polymorphisme de méthodes en PHP ?
Je veux dire par là que le langage prend en compte les signatures des méthodes, si bien que je pourrais déclarer deux fonctions du même nom mais qui ont des paramètres différents?
Par exemple :
Ce qu'on retrouve dans des langage comme C#.NET ou Java.
Merci pour vos réponses,
N.
J'utilise depuis peu le PhP et ne suis pas très familière avec ce langage. Existe t-il un polymorphisme de méthodes en PHP ?
Je veux dire par là que le langage prend en compte les signatures des méthodes, si bien que je pourrais déclarer deux fonctions du même nom mais qui ont des paramètres différents?
Par exemple :
public function foo(){...}
public function foo($arg1){...}
Ce qu'on retrouve dans des langage comme C#.NET ou Java.
Merci pour vos réponses,
N.
A voir également:
- Php polymorphisme
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Retour a la ligne php - Forum Webmastering
- Alert php - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
3 réponses
Bonjour,
Non, cela n'est pas possible en php.
C'est principalement dû au fait que les variables ne sont pas typées. Du coup, comment distinguer foo($intarg) de foo($strarg) ?
Par contre, on peut attribuer des valeurs par défaut aux arguments, ce qui permet d'obtenir un semblant de polymorphisme :
public function foo($arg1 = "bar"){}
Cette fonction peut s'appeler de deux façons :
foo();
ou
foo("bar2");
Si on l'appelle de la première façon, la variable $arg1 dans le corps de la fonction vaudra "bar".
Xavier
Non, cela n'est pas possible en php.
C'est principalement dû au fait que les variables ne sont pas typées. Du coup, comment distinguer foo($intarg) de foo($strarg) ?
Par contre, on peut attribuer des valeurs par défaut aux arguments, ce qui permet d'obtenir un semblant de polymorphisme :
public function foo($arg1 = "bar"){}
Cette fonction peut s'appeler de deux façons :
foo();
ou
foo("bar2");
Si on l'appelle de la première façon, la variable $arg1 dans le corps de la fonction vaudra "bar".
Xavier
Salut Xavier,
Merci de ta réponse, c'est dommage qu'on est pas (encore) de surcharge en PhP, l'alternative que tu proposes me servira sans doute.
a +,
N.
Merci de ta réponse, c'est dommage qu'on est pas (encore) de surcharge en PhP, l'alternative que tu proposes me servira sans doute.
a +,
N.
Salut,
Parfois c'est tout le comportement de la méthode qui change, et non seulement ses paramètres, donc jettes un oeil sur ça, et plus précisément sur runkit_function_redefine qui te permet de redéfinir une fonction.
Je ne l'ai pas essayé, mais j'imagine que c'est possible par exemple d'appeler runkit_function_redefine dans le constructeur afin de redéfinir une méthode héritée.
Jamais essayé, donc aucune garantie que ça fonctionne.
PS : Il faut néanmoins installer l'extension PECL avant de pouvoir utiliser les fonction runkit.
Parfois c'est tout le comportement de la méthode qui change, et non seulement ses paramètres, donc jettes un oeil sur ça, et plus précisément sur runkit_function_redefine qui te permet de redéfinir une fonction.
Je ne l'ai pas essayé, mais j'imagine que c'est possible par exemple d'appeler runkit_function_redefine dans le constructeur afin de redéfinir une méthode héritée.
Jamais essayé, donc aucune garantie que ça fonctionne.
PS : Il faut néanmoins installer l'extension PECL avant de pouvoir utiliser les fonction runkit.
Pas tout le temps, si on est dans le même contexte, pourquoi créer une autre fonction !
Il n'y a pas que les paramètres de la méthode qui peuvent changer !
public class Personne { public void sauter() { // Une centaine de lignes décrivant un saut standard } } public class Handicape extends Personne { public void sauter() { // Une ou deux lignes seulement expliquant qu'il est impossible de sauter } }
Il n'y a pas que les paramètres de la méthode qui peuvent changer !