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] Interface et méthode abstraite en PHP5


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [POO] Interface et méthode abstraite en PHP5
    Bonsoir,

    Je rencontre un problème un peu particulier avec les interfaces en PHP5, ou plutôt une curiosité... :

    Soit une interface quelquonc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Extrait de code PHP5
     
    interface iExemple
    {
         public function __construct($argv);
     
         public function getVar($param);
    }
    Et une classe qui l'implémente :

    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
     
     
    class QuelqueChose implements iExemple
    {
          function __construct()
          {
              echo "Hello";
              // ...
          }
     
          function getVar($param)
          {
            // ...
          }
    }
    Le code qui ci-dessus ne produira aucune erreur.

    Pourtant, dans l'interface iExemple, le constructeur a été défini avec un paramère ($argv), tandis que dans la classe QuelqueChose, le constructeur a été redéfini sans ce paramètre.

    Je comprends pas, le rôle de l'interface et de préciser la nature de la méthode, et de provoquer une erreur fatale si la sémantique n'est pas respectée... (Si j'avais omis le paramètre pour la méthode getVar, ça aurait été signalé).

    Alors, j'ai pensé pouvoir forcer la chose en déclarant dans l'interface, le constructeur comme méthode abstraite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Extrait de code PHP5
     
    interface iExemple
    {
         abstract function __construct($argv);
     
         public function getVar($param);
    }
    Effectivement, là ça marche. PHP me retourne une erreur (le constructeur de la classe QuelqueChose étant différent).

    Mais voilà, dans le manuel PHP, il est précisé qu'une classe implémentant une méthode abstraite doit elle-même être abstraite.

    Et donc, cela veut dire "pas de méthode abstraite dans une interface, seulement dans une classe abstraite" ?

    Ou alors ils définissent les classes abstraites comme étant toute classe qui ne peut s'instencier (précisément les classes abstraites et les interfaces)

    Voilà, j'espere que vous avez compris la chose, c'est pas évident à expliquer...

    Meric d'avance !

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Si tu pouvais être plus précis swoog se serait pas mal. Parce que je doit bien dire que le point soulever par guardian m'interpelle aussi.

    A vrai dire je ne pensais même pas que l'on pouvait définir une méthode abstraite dans une interface et c'est extremement bizarre.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Hello Swoög,

    Merci pour la réponse rapide !

    J'ai déjà bien lu ces pages du manuel (enfin je crois), j'ai retenu les grandes lignes :

    - Les interfaces ne comportent que des méthodes PUBLIQUES.

    - Les classes astraites comptent au moins une méthode abstraite.


    Ok ça répond à ma question (sur le plan théorique) : Pas de classe abstraite dans une interface.

    Mais alors comment faire pour que le constructeur d'une interface soit pris en compte par les classes qui l'implémente ?

    Parcque il semblerait que ce soit pas le cas... Et c'est bien là mon problème

  5. #5
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    à priori, d'après leur conception, une interface ne doit pas avoir de donnée membres, donc pas besoin de constructeur

    ePoX : logiquement, toutes les méthodes d'une interface sont abstraites (et publiques)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  6. #6
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Et oui je sais bien. C'est bien pour cette raison que déclarer une méthode abstraite dans une interface me parait complètement absurde.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Swoög
    à priori, d'après leur conception, une interface ne doit pas avoir de donnée membres, donc pas besoin de constructeur
    En partant de ce principe, ça démontrerait la différence entre une Interface et une classe abstraite (au niveau de la conception).

    Mais bon, ça n'empêche pas l'utilisation d'une méthode abstraite dans une interface, c'est de la contre-nature !

  8. #8
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    pour eux à priori, il y a trois type de classes :
    • interfaces : que des méthodes publiques et abstraites, pas de données membres
    • classes abstraites : classe normale avec au moins une fonction abstraite
    • classes normale
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/10/2009, 18h09
  2. POO : besoin de confirmation sur classe abstraite
    Par loic20h28 dans le forum Design Patterns
    Réponses: 8
    Dernier message: 20/01/2009, 08h43
  3. [POO] Interface en php
    Par lepotier dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2008, 13h25
  4. [POO] Interface ou héritage ?
    Par s.n.a.f.u dans le forum VB.NET
    Réponses: 3
    Dernier message: 17/03/2007, 01h02
  5. [POO] Interfaces : Késako ?
    Par viviboss dans le forum Langage
    Réponses: 33
    Dernier message: 17/11/2006, 16h58

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