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

PHP & Base de données Discussion :

[PHP5] Polymorphisme urgent svp


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 625
    Par défaut [PHP5] Polymorphisme urgent svp
    bonjour,

    voila j'essaie d'utiliser le polymorphisme en php 5 mais j'ai un soucis voila un exemple d'utilisation.
    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
     
     
    class test 
     
    {
     
     
    protected function nom_de_methode();
     
    }
     
     
    test2 extends test
    {
     
    	public function nom_de_methode($variable1, $variable2, $variable3, $variable4);
    	{
                 // Traitement
            }
     
    }
     
    test3 extends test
    {
     
    	public function nom_de_methode($variable1, $variable2, $variable3, $variable4);
    	{
                 // Traitement
            }
     
    }
    qu'est-c-e qu'il faut rajouter pour que sa marche ?
    merci beaucoup de m'aider c'est pour mardi !

  2. #2
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Par défaut
    Pour que ça marche, il ne faut pas augmenter le niveau de definition des fonctions (de protected à public -> interdit), mettre les même paramètres (je n'en suis plus tout a fait sur).

    dans les classes, il ne faut pas définir les fonction comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected function nom_de_methode();
    mais comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected function nom_de_methode(){}
    Si vous voulez utiliser la première syntaxe, vous devez créer une interface, ou alors créer une classe abstraite.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 625
    Par défaut
    donc avec les méthodes abstraites je peux faire du polymorphisme ?

    exemple d'utilisation:

    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
     
    abstract test
    {
        abstract function nom_de_methode();
    }
     
     
    test2 extends test
    {
      // qu'est-ce que je dois faire ici ?
    }
     
    test3 extends test
    {
      // qu'est-ce que je dois faire ici ?
    }
    -----------------------

    et dans le second cas:

    tu es sure de la syntaxe ?

    Parse error: syntax error, unexpected ';', expecting T_FUNCTION

    protected function nom_de_methode(){};

    c'est toujours du polymorphisme ?

  4. #4
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    Merci de mettre les balises CODE (bouton #) afin d'avoir une plus grande lisibilité dans votre code.

    Soit une classe abstraite Test, elle ne peut être instanciée qu'au travers d'une classe fille (qui en hérites).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    abstract class Test{
        private $value;
     
        public function __construct($value){
            $this->value = $value;
        }
     
        public function getValue(){
            return $this->value;
        }
     
        abstract public function isValid();
    }
    Soit une classe NotEmptyTest héritant de la classe abstraite Test et implémentant (obligatoirement) la méthode abstraite isValid.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class NotEmptyTest extends Test {
        public function isValid(){
            return !empty($this->getValue());
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $emptyTest = new NotEmptyTest('truc');
    var_dump($emptyTest->isValid());
    La documentation sur ce sujet est très bien expliquée : http://fr.php.net/abstract

    Toutes les classes contenant au moins une méthode abstraite doivent également être abstraites.
    Lors de l'héritage d'une classe abstraite, toutes les méthodes marquées comme abstraites dans la déclaration de la classe parent doivent être définies par l'enfant ; de plus, ces méthodes doivent être définies avec la même visibilité, ou une visibilité moins restreinte.
    Bonne journée

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 625
    Par défaut
    euh.... ok merci mais alors pourquoi j'ai des erreurs:

    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
     
    abstract class Mail
    {	
     
    	abstract public function envoyer_mail();
     
    }
     
    class MailNormal extends Mail
    {
     
    	public function envoyer_mail($_expediteur_nom, $_destinataire_mail, $_expediteur_mail, $_message, $_objet) 
    	{
                // Traitement A
    	}	
    }
     
    class MailPJ extends Mail
    {
    	public function envoyer_mail($_expediteur_nom, $_destinataire_mail, $_expediteur_mail, $_message, $_objet, $file_name) 
    	{
                // Traitement B
    	}	
    }
     
    Fatal error: Declaration of MailNormal::envoyer_mail() must be compatible with that of Mail::envoyer_mail()

  6. #6
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Citation Envoyé par noobyyy Voir le message
    euh.... ok merci mais alors pourquoi j'ai des erreurs:
    Tu n'as pas spécifié les paramètres dans la signature de la méthode abstraite envoyer_mail.

  7. #7
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Par défaut
    Petit exemple:

    Avec une interface est 2 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
    17
     
    <?php
    abstract class test{
      abstract function render();
    }
     
    class test2 extends test{
      public function render(){
        return "bar";
    }
     
    class test3 extends test2{
     
      public function render(){
        return "foo";
      }
    }
    Tu pourrai utiliser ce code comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
      // la tu passe un objet de type 'test'
      function renderTestClass(test $t){
        return '<b>'.$t->render().'</b>';
     }
     
      // affiche foo
      echo renderTestClass(new test2());
     
      // affiche bar
      echo renderTestClass(new test3());

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Urgent Svp : suis planté!
    Par PAUL87 dans le forum Access
    Réponses: 1
    Dernier message: 14/07/2006, 13h37
  2. Urgent Svp : Fichier Mde
    Par Hamdi dans le forum Access
    Réponses: 1
    Dernier message: 06/06/2006, 13h34
  3. psql sur template1 et suppression de base URGENT SVP
    Par donny dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/08/2005, 10h59
  4. Urgent svp parametre variable de executeQuery
    Par debdev dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 11h09
  5. [HVMenu] problème dans les pages ASPX (urgent svp)
    Par hatembr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/01/2005, 09h37

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