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 :

pHp ne "comprend" pas le mot clef abstract


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 136
    Points : 89
    Points
    89
    Par défaut pHp ne "comprend" pas le mot clef abstract
    J'ai une classe abstraite et dans son constructeur j'appelle une méthode abstraite. Php me lève une erreur alors que je veux simplement lancer cette méthode abstraite dans toutes les classes filles (et donc forcer la redéfinition). Je ne comprend pas pourquoi php me lève une erreur si je déclare bien la fonction dans toutes les classes filles (puisque le constructeur n'est jamais directement appelé dans la classe abstraite).

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    abstract class AbsClass{
       protected function __construct(){
          self::setOptions();
       }
     
       protected abstract static function setOptions();
    }

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    tu peux pas faire du abstract static c'est pas logique

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Tu dois passer par une interface :
    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
    <?php
     
    interface IFoo {
       static function test();
    }
     
    abstract
    class Bar
       implements IFoo
    {
       static public function name() {
          return static::test();   // PHP 5.3+ : late static binding
       }
    }
     
    class FooBar
       extends Bar
    {
       static public function test()
       {
          return 'aaaa';
       }
    }
     
    $a = FooBar::name(); // aaaa
     
    ?>

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 136
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    tu peux pas faire du abstract static c'est pas logique
    Mon exemple montre que si :
    * toutes les instances d'une même classe fille partagent les mêmes options.
    * setOptions ne modifie donc que des attributs de classe.
    * setOptions ne dépend donc pas de l'instance donc elle est static.
    * de plus setOptions est abstract puisque toutes les classes filles en héritent et doivent le redefinir.

    Comme je suis sous 5.1 je n'ai pas le late static binding et je ne peux donc pas faire ce que je veux. Je dois coller en dur l'appel à setOptions dans tous les constructeurs des classes filles.....

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Je peux t'affirmer que le petit père stealth35 a mille fois raison.
    Une méthode abstract static function () n'a aucun sens dans la mesure où abstract veut dire pas de fonctionnalité sans instance et que static veut dire qu'il y a une fonctionnalité sans instance. On nage en pleine contradiction, non ?
    En conclusion abstract static function () est doublement un non-sens. Non-sens logique et sémantique.
    Après techniquement, à l'opposé de ce que tu pourrais croire, il n'y a aucun polymorphisme dans le monde static. Tu peux redéfinir des méthodes statiques dans toutes les classes enfants, leur portée restera toujours la classe où elles ont été définies. C'est différent d'un polymorphisme au sein d'une instance de classe.

    Tu dois revoir ton design en faisant appel aux interfaces, sinon sous un serveur en mode STRICT, ton joli code ne fonctionnera jamais.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 136
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    [...] dans la mesure où abstract veut dire pas de fonctionnalité sans instance [...]
    Donc il n'y aurait pas de différence entre une methode abstract et une methode d'instance simple? Abstract veut dire à redefinir dans les classes filles. C'est simplement que php ne prend pas (mal) en charge cette possibilité.

    Citation Envoyé par rawsrc Voir le message
    Après techniquement, à l'opposé de ce que tu pourrais croire, il n'y a aucun polymorphisme dans le monde static.
    Je ne comprends pas très bien ce que tu as voulu dire. Il ne peut pas y avoir polymorphisme dans un langage non typé. Quand j'appelle une methode statique ou non php choisit la méthode la plus "basse" dans la l'arbre des classes.

    Sinon pour l'interface je ne peut pas l’implémenter comme ça car come je l'ai dit je suis dans php 5.1 et donc je ne dispose pas du mot clef static.

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Je cite la doc PHP :
    Les classes définies comme abstraites ne doivent pas être instanciées, et toutes les classes contenant au moins une méthode abstraite doivent aussi être abstraites.
    On est bien d'accord que les classes abstraites ne peuvent être instanciées par définition. Mais, il est prévu que les classes dérivées non abstraites le soient, toujours d'après la définition.
    Or dans ton cas, tu t'affranchis de l'instance en mélangeant abstract avec static d'où ton message d'erreur.

    La classe abstraite est surtout utile pour factoriser le code sur un arbre de dérivées. Dans une architecture correcte, cela te permet de descendre les traitements communs à la racine et de profiter du polymorphisme pour rappatrier les données des dérivées dans la classe racine. Tout autre utilisation enfreint le postulat de départ et est incorrect. N'oublies pas que pour profiter du polymorphisme, tu as besoin d'avoir au moins une instance de classe.

    Dans ton cas de figure, les fonctions statiques (accessibles sans instance de classe) ne te permettent pas d'atteindre une valeur dans une classe dérivée afin de la manipuler dans la classe parente et en conséquence avoir abstract static function est totalement erroné.

    Si tu veux forcer la definition d'une fonction statique, tu dois utiliser une interface partout où cela est nécessaire comme indiqué dans un message plus haut.

    Il ne peut pas y avoir polymorphisme dans un langage non typé
    Bah là, je vais te sécher, mais le polymorphisme en PHP fonctionne très bien même si le langage n'est pas typé. Relis mon explication sur l'utilisation du mot-clé abstract.
    Le typage dans le polymorphisme est lié à une classe et non à un type natif !

    PS : Penses toujours que ton code va s'exécuter dans un environnement STRICT, analyses les alertes et mise à part les broutilles, reprends le autant de fois que nécessaire.
    N'oublies pas que l'ordinateur est con mais il a souvent raison

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