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] Ecraser une méthode d'une classe


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Points : 24
    Points
    24
    Par défaut [POO] Ecraser une méthode d'une classe
    Bonjour,

    J'ai une class avec des fonctions que je veux modifier mais sans toucher à la class, comment puis-je faire ?

    J'ai penssé à un creer une nouvelle class avec dedans la donction que je veux ecraser mais ca fonctionne pas :

    fichier test3.php qui appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    include('test.php');
    include('test2.php');
     
    $test = new test;
     
    echo $test->test();
    fichier test.php ma class principal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class test{
     
    function test()	{
     
    return 'hello';
    }
     
    }
    fichier test2.php, ma class de remplacement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class test2 extends test{
     
    function test()	{
     
    return 'hello2';
    }
     
    }

    COmment puis je avoir 'hello2' sans changer class test, inclure les deux class et en gardant le même non d'objet ?? En faite je voudrais ecraser la fonction test dans la class test !

  2. #2
    Membre habitué
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 144
    Points : 151
    Points
    151
    Par défaut
    tu crée une autre classe mais qui est abstraite. Tes deux autres classes tu les étendra avec celle là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    abstract class laClasseAbstraite {
     
       protected abstract function test();
     
    }
    Tu étend chacune des classes avec la classe abstraite et tu es obligé de surcharger la fonction test.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class test extends laClasseAbstraite {
       protected function test {
          return "Hello";
       }
    }
    public class test2 extends laClasseAbstraite {
       protected function test {
          return "Hello2";
       }
    }
    Par contre tu ne pourra pas avoir le même nom d'objet tu sera obligé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $test = new test();
    echo $test->test();
     
    $test2 = new test2();
    echo $test2->test();
    L'abstraction de classe te permet de redefinir les fonctions abstraites dans chaque classe que tu aura étendu. Donc tu pourra avoir 100 même 1000 classe test tu pourra la redéfinir autant de fois.

    Je pense que sa se rapproche de se que tu veux

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Si j'utilise une class abstraite je dois toucher à ma class ce qui n'est pas possible...je voulais aussi ne pas toucher a la déclaration de mon objet mais c'est peut etre pas possible, je me contenterai donc de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $test = new test2;
    echo $test->test();
    Merci

  4. #4
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    Par défaut
    Quel est le status de la fonction a surcharger ("ecraser") ?
    Soit public, protected ou private. On ne peut pas surcharger des methodes ("fonction") privates.

    A part l'extension, il existe une autre solution, le patron de conception ("design pattern") decorateur. L'idee est d'agreger la classe a decorer et de deleguer les appels a toutes les methodes qui ne sont pas a surcharger.

    Exemple:
    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
     
    <?php
    class decorator
    {
      protected $parent = null;
      public function __construct( NomDeClassADecorer $parent )
      {
        $this->parent = $parent;
      }
      public function __call( $method, $arguments )
      {
        switch( $method )
        {
          case 'test':
            return call_user_func_array( array( $this, $method ), $arguments );
          default:
            return call_user_func_array( array( $this->parent, $method ), $arguments );
        }
      }
    }
    ?>
    http://smeric.developpez.com/java/uml/decorateur/

    Dans les deux cas, on ne peut toujours pas surcharger de classes privates.

  5. #5
    Membre habitué
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 144
    Points : 151
    Points
    151
    Par défaut
    Je suis un peu à la ramasse. Est ce que tu veut parler du pattern "Factory". Parce que c'est plus au niveau des constructeurs que c'est utile. Enfin bon je pense avoir mal compris. Pourrais tu préciser sa m'interesse.

  6. #6
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    Par défaut
    Je confirme que je parle du patron de conception decorator pour juninho269.

Discussions similaires

  1. [PHP 5.3] [POO] Appel d'une méthode dans une méthode
    Par yann18 dans le forum Langage
    Réponses: 6
    Dernier message: 20/10/2011, 10h56
  2. POO Récupération de données d'une méthode d'une fonction
    Par totojordi dans le forum Zend Framework
    Réponses: 4
    Dernier message: 09/04/2010, 15h05
  3. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 20h05
  4. Réponses: 6
    Dernier message: 20/04/2007, 16h24
  5. "ajouter une méthode dans une méthode"
    Par Zorgloub dans le forum Langage
    Réponses: 1
    Dernier message: 09/04/2006, 13h53

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