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

  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 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());

  6. #6
    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()

  7. #7
    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.

  8. #8
    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
    ah ! mais une personne que je connais m'avais dit que ce n'était pas obligatoire.

    donc que se passerai t-il si je déclare 3 paramètres et finalement j'en utilise 4 ou 5 ?


    edit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    abstract public function envoyer_mail($_expediteur_nom, $_destinataire_mail, $_expediteur_mail, $_message, $_objet);
    voila j'ai rajouté mes parametres mais j'ai toujours la même erreure

  9. #9
    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
    Non tu n'as pas rajouté les paramètres, une des signatures que tu utilise nécessite la présence du paramètre $file_name, tu peux tout simplement mettre ce paramètre avec une valeur par défaut :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abstract public function envoyer_mail($_expediteur_nom, $_destinataire_mail, $_expediteur_mail, $_message, $_objet, $_file_name = null);

  10. #10
    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 l'attribut file_name je suis obligé de le rajouter dans la classe mere, le déclarer et tout...

    cependant

    dans la classe fille MailNormal je n'ai pas besoin de cette attribut comment je fais ?

  11. #11
    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
    J'ai déjà répondu à cette question dans ma réponse précédente, il suffit de mettre une valeur par défaut, de cette manière, tu n'as pas besoin de spécifier obligatoirement ce paramètre.

  12. #12
    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
    ok ok pourtant j'ai toujours un le même message d'erreur doit y avoir un truc que je ne comprends pas. Vous avez une idée ?

  13. #13
    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
    En fait je viens de chercher un peu partout je ne sais pas si c'est possible de spécifier des paramètres avec valeur par défaut dans une déclaration de méthode abstraite, à mon avis tu vas être obligé de le déclarer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    abstract public function envoyer_mail($_expediteur_nom, $_destinataire_mail, $_expediteur_mail, $_message, $_objet, $_file_name);
    et probablement initialiser à null la valeur dans la surcharge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function envoyer_mail($_expediteur_nom, $_destinataire_mail, $_expediteur_mail, $_message, $_objet, $_file_name = null){
        // do
        if(!is_null($_file_name)){
            // do with $_file_name
        }
    }

  14. #14
    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 : 41
    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
    Le plus simple étant de donner un seul et unique argument qui sera un tableaux.
    Et selon tes class tu agit sur cet unique argument en conséquence.
    Ainsi tu pourra avoir un tableaux vide (0 argumtns) ou un tableau avec 250 entrée si ca te chante
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    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
    c'est bon j'ai résolu le soucis, merci à vous !

+ 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