IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Surcharge et polymorphisme


Sujet :

Langage PHP

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut [POO] Surcharge et polymorphisme
    Bonjour à vous tous,

    Moi aussi, je me suis mis à la POO en PHP il y a peu.
    La POO, je pense en connaître les principes pour l'avoir étudiée avec Java (et le bouquin Tête la première).
    Mais bon, moi, c'est PHP et je voulais passer du procédural à la POO donc me voilà.

    Et à ce propos, je me posais une petite question : le polymorphisme et la surcharge sont-ils possibles en PHP ?

    J'ai l'impression que non... Est-ce que je me trompe ?

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Si par surcharge, tu entends "plusieurs méthodes d'une classe portant le même nom mais avec des paramètre différents", alors non, ça ne marche pas en php. En revanche tu peux rendre des paramètres optionnels, en leur donnant une valeur par défaut.
    La notion de surcharge existe en php, mais ne fonctionne pas vraiment de la même façon surcharge (perso je ne m'en suis jamais servie)

    En ce qui concerne le polymorphisme, la question a été posée là : http://www.developpez.net/forums/d78...polymorphisme/
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre émérite Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Par défaut
    A propos de la surcharge,
    "plusieurs méthodes d'une classe portant le même nom mais avec des paramètres différents",
    les trois fonctions func_num_args , func_get_arg et func_get_args,
    ne permettent-elles pas finalement de la mettre en oeuvre ?
    Fred

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Si, ou les valeurs par défaut des arguments qui les rendent optionnels, mais ça oblige à écrire des blocs en fonction du nombre d'arguments ou déléguer les fonctions.
    C'est pas catastrophique mais ça reste de la bidouille. En terme de maintenance c'est un peu plus lourd.

    En même temps ça a ses avantage aussi donc l'un dans l'autre on peut dire que c'est juste "différent"

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    Hum... Je dois avouer que je coince un peu, là, même en ayant lu l'explication de la doc.
    Je vois pas très bien comment ça fonctionne avec des arguments optionnels.
    Quelqu'un pourrait-il donner un exemple ?

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Par optionnel, je veus dire que tu donnes une valeur par défaut à certains de tes arguments
    Voir :Fonctions en php
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    Hum... Ca m'éclaire pas sur le fonctionnement des fonctions avec arguments ayant une valeur par défaut, dans le but de surcharger.
    Personne voudrait se fendre d'un petit exemple d'utilisation ?

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Prenons une classe Personne avec une méthode saluer. Admettons qu'on veuille surcharger cette méthode (selon l'appellation courante) pour pouvoir soit saluer tout le monde, soit saluer quelqu'un en particulier.

    La construction type Java qui ne fonctionne pas en PHP donnerait quelque chose comme ça
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Personne{
      public function saluer(){
        echo "Bonjour tout le monde";
      }
     
      public function saluer($nom){
        echo "Bonjour ".$nom;
      }
    }
    $celira = new Personne();
    $celira->saluer(); //=> Bonjour tout le monde
    $celira->saluer('swampsnake'); //=> Bonjour swampsnake
    Là on se mange une erreur genre "impossible de redéfinir fonction"

    La bonne syntaxe consiste à donner une valeur par défaut au paramètre :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Personne{
      public function saluer($nom = 'tout le monde'){
        echo "Bonjour ".$nom;
      }
    }
    $celira = new Personne();
    $celira->saluer(); //=> Bonjour tout le monde
    $celira->saluer('swampsnake'); //=> Bonjour swampsnake
    Une autre version, si on veut deux résultats distincts
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class Personne{
      public function saluer($nom = NULL){
        if (! is_null($nom))
        {
          echo "Bonjour ".$nom;
        }
        else
        {
           echo "Salutations générales";
        }
    }
    $celira = new Personne();
    $celira->saluer(); //=> Salutations générales
    $celira->saluer('swampsnake'); //=> Bonjour swampsnake
    C'est plus clair comme ça ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    Oui, là, je vois beaucoup mieux comment ça marche.
    Par contre, dans le cas où on aurait plusieurs arguments dont certains optionnels et d'autres pas, ça se présenterait comment ?
    Peut-être faut-il mettre tous les arguments avec une valeur par défaut ?

    Une autre question : là, j'ai la méthode saluer() dans la classe personne avec un argument.
    Est-ce que je peux la redéfinir dans une classe fille (class Swampsnake extends Personne) comme je veux (c'est à dire avec un nombre d'arguments différents) ou bien y a-t-il des règles spécifiques ?

  10. #10
    darthmower
    Invité(e)
    Par défaut
    Salut,

    Le fait qu'on ne puisse pas surcharger peut s'expliquer assez facilement (selon moi). Sachant que PHP a un très faible typage, il n'est pas forcement évident et utile de surcharger pour des int ou des float comme on pourrait en voir l'utilité en C++ ou Java par exemple. Cependant il est possible de tester sur le type de variable exemple:

    Tu veux pouvoir passer un tableau ou une chaîne de caractère, il te suffit de faire le teste suivant pour savoir que faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function jeSersARien($maVar)
    {
      if( is_array($maVar) )
      {}
      else
      {}
    }
    Gripsou

  11. #11
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Citation Envoyé par swampsnake Voir le message
    Oui, là, je vois beaucoup mieux comment ça marche.
    Par contre, dans le cas où on aurait plusieurs arguments dont certains optionnels et d'autres pas, ça se présenterait comment ?
    Peut-être faut-il mettre tous les arguments avec une valeur par défaut ?
    Tu peux mixer arguments sans valeur par défaut et arguments avec valeurs par défaut mais il faut mettre tous les arguments obligatoires d'abord (logique, sinon ça risque de tout décaler)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //le nom est obligatoire, le type de salut optionnel
    public function saluer($nom, $salut = 'bonjour')
    {
      echo $salut.' '.$nom;
    }
    $celira->saluer('swampsnake'); //=> bonjour swampsnake
    $celira->saluer('swampsnake', 'au revoir') //=> au revoir swampsnake
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    Ok, merci pour l'explication. Je pense que j'ai compris ce point là, ça va me permettre de le travailler.
    Je reviendrais en cas d'autres interrogations.
    Merci encore

  13. #13
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 156
    Par défaut
    Désolé de remonter ce sujet pour un post qui n'est pas des plus utiles : ce post m'a appris quelque chose de très utile, qui va me servir, et ceci grâce à des explications d'une clarté exemplaire ! Longue vie à ce forum, qui est le meilleur - à ma connaissance - pour les questions développement !
    Merci !

Discussions similaires

  1. [POO] surcharge d'operateur
    Par wamania dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 14h31
  2. [POO] surcharger le constructeur
    Par wdionysos dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 15h42
  3. [POO] Surcharge de méthode
    Par ouioui2000 dans le forum Langage
    Réponses: 4
    Dernier message: 09/03/2006, 15h25
  4. [POO] Surcharge d'opérateurs []
    Par Amnesiak dans le forum Langage
    Réponses: 28
    Dernier message: 11/11/2005, 12h44
  5. Surcharge et Polymorphisme
    Par Hell dans le forum C++
    Réponses: 6
    Dernier message: 12/01/2005, 20h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo