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 :

Surcharge de méthode/classe


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Par défaut Surcharge de méthode/classe
    Salut,

    Je ne poste pas souvent pour demander de l'aide car j'arrive souvent à trouver une solution en creusant dans mon coin.
    Là, par contre, je suis totalement bloqué et je ne vois pas de solution.

    Je sais qu'en faisant hériter une classe d'une autre, il est possible de redéfinir une méthode.
    Je sais que PHP ne permet pas de surcharger une méthode d'une classe.

    Bien entendu, je me retrouve dans le second cas.

    Prenons l'exemple de deux classes :
    - Utilisateur
    - UtilisateurSurcharge

    Initialement, je définis une méthode vConnexion dans Utilisateur.
    Ensuite, je définis une méthode vConnexion dans UtilisateurSurcharge. C'est cette dernière que je souhaite utiliser.
    Il n'y a pas de notion d'héritage entre les deux car je ne souhaite pas redéfinir tous mes appels. Par exemple, dans mon code, je fais des new Utilisateur et je ne veux pas à avoir à passer dans tous le code.
    Cela ne me dérangerait pas ponctuellement mais le but est de généraliser le fonctionnement.

    Est-ce que quelqu'un aurait déjà mis en place un système permettant de pallier à ce manque de surcharge svp ? Même si cela n'est pas natif, un moyen malin de simuler la surcharge ?

    Merci de votre aide et de votre lecture

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Je ne comprend pas bien ta question car ceci fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    <?php
    class a {
     
     
        function go(){
            echo 'go';
        }
     
        function start(){
     
            echo 'start';
        }
     
    }
     
    class b extends a {
     
        function start()
        {
     
            echo 'Run';
        }
     
     
     
    }
     
     
    $b = new b();
    $b->go(); // affiche go
    $b->start(); //affiche Run

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Je vois 2 solutions pour palier à l'absence de surcharge.

    1- Passer un tableau d'argument au lieu d'une liste d'argument et donc d'appeller la bonne méthode privé dans la classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class MaClasse
    {
        public function maFunction(array $param)
        {
            $nb = count($param);
            if($nb == 1)
                $this->maFunctionUn($param[0]);
            else if ($nb == 2)
                $this->maFunctionDeux($param[0],$param[1]);
     
        }
     
        private function maFunctionUn($param){}}
     
        private function maFunctionDeux($param1,$param2){}
    }

    2- Compter directement le nombre de paramètre passés :

    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $total = func_num_args();
    $args = func_get_args();
    @MaitrePylos , tu fais de la redéfinition dans ton exemple , pas de la surcharge
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éclairé Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Par défaut
    Merci de vos réponses.

    @MaitrePylos : Il s'agit d'une redéfinition de méthode liée à l'héritage, cela ne convient donc pas mais merci.

    @grunk: Cela ne me parait pas non plus satisfaisant car si ma méthode de surcharge contient le même nombre de paramètres cela ne fonctionne pas.
    De plus, comme indiqué, je souhaite généraliser le fonctionnement à toutes les méthodes de toutes les classes et cela ne m'inspire que très peu d'injecter une portion de code dans chaque.

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Peux-tu expliquer clairement ce que tu veux?

    Surtout ceci:
    Il n'y a pas de notion d'héritage entre les deux car je ne souhaite pas redéfinir tous mes appels. Par exemple, dans mon code, je fais des new Utilisateur et je ne veux pas à avoir à passer dans tous le code.
    S'il n'y a pas d'héritage, quel est le problème?

  6. #6
    Membre éclairé Avatar de Jiraiya42
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    671
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 671
    Par défaut
    Oui je ne suis peut-être pas assez clair donc je vais reprendre en prenant un cas précis.

    Lors d'un développement précédent, nous avons créé une classe Utilisateur possédant différentes méthodes, variables.
    Une de ces méthodes est vConnexion permettant de se connecter à la base de donnée.
    Il faut bien garder à l'esprit que ce module utilisateur est terminé et qu'il ne doit pas être modifié pour le développement spécifique.

    Je veux donc surcharger ma méthode Utilisateur::vConnexion pour l'adapter à mon développement spécifique.
    J'ai donc besoin de créer une classe de surcharge UtilisateurSurcharge et je crée ma méthode vConnexion dedans.

    Pour rappel, dans mon module initial, l'instanciation de ma classe se fait toujours de la manière suivante : new Utilisateur() et donc non pas new UtilisateurSurcharge() : voici donc le premier problème.
    Il faudrait donc que l'instanciation via new Utilisateur() soit interceptée pour faire un new UtilisateurSurcharge() à la place

    Quand je dis qu'il n'y a pas d'héritage c'est que UtilisateurSurcharge ne peut hériter de Utilisateur puisque je ne l'appelle jamais directement.

    Suis-je plus clair ?

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    C'est pour ça que je recommande toujours de créer une interface même quand on fait une seule classe, et ne pas utiliser new() mais plutôt d'injecter un objet créé par un factory et on me dit souvent que c'est de l'overengineering. Une interface t'aurait aidée ici.

    Tout ça ne t'aide pas évidemment si tu ne peux modifier ni la classe Utilisateur ni le code qui utilise la classe Utilisateur. Peut-être que runkit peut t'aider, notamment runkit_method_redefine mais ça implique de pouvoir installer une extension pecl.

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par Jiraiya42 Voir le message
    si ma méthode de surcharge contient le même nombre de paramètres
    Si tu as le même nombre de paramètre et les même type ce n'est plus une surcharge

    Je fait pas de test sur les type dans mon exemple mais c'est bien évidemment possible.

    Y'a pas d'autre solution pour émuler la surcharge
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. template class & surcharge de méthode
    Par Gébix dans le forum C++
    Réponses: 2
    Dernier message: 27/12/2011, 00h38
  2. [1.x] surcharger la méthode save() de la classe du modèle
    Par Mich972 dans le forum Symfony
    Réponses: 2
    Dernier message: 23/08/2010, 17h26
  3. Surcharger les méthodes d'une class mère
    Par Djobird dans le forum Langage
    Réponses: 8
    Dernier message: 06/06/2008, 16h54
  4. [Custom Tags] Problème avec une surcharge de méthode
    Par Strab dans le forum Taglibs
    Réponses: 19
    Dernier message: 26/08/2005, 16h34
  5. Comment surcharger la méthode OnClose d'un TFrame ?
    Par sdebrois dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/01/2005, 20h57

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