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 :

Late static binding avec static function et implements [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut Late static binding avec static function et implements
    Bonjour à tous,
    Comment faire pour savoir si une classe dérivée composée que de fonctions statiques implemente une interface spécifique quand la fonction appelée par la dérivée est localisée dans la classe parente.
    Je sais pas si c'est super clair, voilà un petit exemple bien plus parlant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    
    interface iTest { }
    
    class base {
    
    public static function create() {
    if (self instanceof iTest) echo 'iTest';
    }
    } class child extends base implements iTest { } child::create();
    Le problème se situe avec le self qui ne gère pas le LSB
    J'ai essayé avec get_called_class() mais là plus question d'objet juste une string. Et à chaque fois le test échoue child n'implémente pas iTest !

  2. #2
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Salut,

    Ne pourrais-tu pas utiliser le mot clé static : http://php.net/manual/en/language.oo...c-bindings.php (example #2).

    Je n'ai pas de php5.3 sous la main, donc pas de tests...

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Alors j'ai bien essayé avec static mais PHP m'envoie bouler : PHP Parse error: syntax error, unexpected T_INSTANCEOF, expecting T_PAAMAYIM_NEKUDOTAYIM

    Voili voilou,

    Je suis en train de voir si avec ReflectionClass il n'y aurait pas moyen de bidouiller
    Si tu as d'autres idées je suis preneur bien évidemment :-)

    J'ai essayé ça : plus de problèmes mais return __CLASS__ me renvoie une string

    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
     
     
    interface iTest { }
     
    class base {	
        public static function create() {
            $r = (static::self() instanceOf iTest);
            if ($r) echo 'iTest';
        }
    }
     
    class child extends base implements iTest { 
        public static function self() {
            return __CLASS__;
        }
    }
    Merci

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Xysyo Voir le message
    expecting T_PAAMAYIM_NEKUDOTAYIM
    Tu as bien mis le double deux-points :: ?

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Et je n'ai peut-être pas assez précisé : personellement, j'essaierais un truc de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (static::get_class() == 'iTest') echo 'iTest';
    => il faut bien sûr oublier le instanceof car il n'y a aucune instance en appel statique

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    avec l'essai conseillé, j'obtient le nom de la classe child et rien concernant ses implémentations

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Bon après plusieurs essais j'ai trouvé une solution au problème :

    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
    <?php
     
    interface iTest { }
     
    class base {	
       public static function create() {
          $r = new ReflectionClass(static::$SELF);
          if (in_array('iTest', $r->getInterfaceNames())) echo 'iTest';
       }
    }
     
    class child extends base implements iTest {	
       protected static $SELF = __CLASS__;
    }
     
    child::create();
     
    ?>
    Bon c'est pas super propre mais pour l'instant je n'ai rien de mieux en magasin

  8. #8
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Xysyo Voir le message
    Bon c'est pas super propre mais pour l'instant je n'ai rien de mieux en magasin
    C'est quand même pas mal vu le besoin un peu tordu.
    Bien joué

  9. #9
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Besoin tordu ! Elle est bonne celle-là. MOUAHAHAHAHA

    Blagues à part, j'ai recherché sur www.php.net cette fonctionnalité et n'ayant rien trouvé, j'en ai profité pour soumettre cette "feature request" à la communauté.

    Voili voilou
    Bonne nuit

  10. #10
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Je vous fait part de la réponse de la communauté php concernant le problème ci-dessus.

    Pour avoir toutes les interfaces implémentées dans un contexte static utiliser : $interfaces = class_implements(get_called_class());
    (class_implements gère pour nous la réflection)
    Ce qui renvoie un tableau comme ma soluce utilisant ReflectionClass sauf que là c'est plus propre et pas de $self à trainer donc voici la solution finale :
    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
    <?php
     
    interface iTest { }
     
    class base {	
       public static function create() {
          if (in_array('iTest', class_implements(get_called_class()))) echo 'iTest';
       }
    }
     
    class child extends base implements iTest { }
     
    child::create();
     
    ?>
    Je pense malgré tout qu'il serait mieux d'avoir un système unifié comme instanceof pour tout. Allez soyons fous : pour englober tous les contextes : je propse de remplacer instanceof par uses et puis il faudrait aussi que get_called_class() renvoie autre chose qu'une string.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    if (get_called_class() uses iTest) echo 'iTest'
    ?>
    Bref ça ne sert à rien mais cela m'a permis d'étrenner mon nouveau clavier MOUAHAHA

  11. #11
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Merci pour le suivi

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

    Juste pour info, ce que tu désirais faire à l'origine n'avais pas de sens car tu essayais de chercher une instance sur une méthode statique, ce qui n'existe pas.

    e pense malgré tout qu'il serait mieux d'avoir un système unifié comme instanceof pour tout
    instanceof compare des instances, pas des types.

  13. #13
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Bonjour
    ce que tu désirais faire à l'origine n'avais pas de sens
    Je le savais dès le départ qu'avec instanceof ça n'allait pas être gagné vu que la classe child n'était qu'un conteneur et n'avait pas d'instance. Enfin à l'utilisation child a bien une existence car get_called_class() renvoie bien la résolution statique à la volée. La logique aurait voulu que qu'elle que soit la manière d'exister on puisse interroger de la même manière les propriétés de cette existence. Mais bon, je sais parfois que la logique...

    M'est d'avis que tous ces procédés : instanceof, ReflectionClass ou le sucre syntaxique (class_implements->array) sont bordéliques. C'est pour cela que je parlais d'unification.

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

Discussions similaires

  1. Problème late binding avec Word et Outlook
    Par sibama dans le forum VB.NET
    Réponses: 4
    Dernier message: 06/12/2009, 21h24
  2. probleme avec static inline
    Par deubelte dans le forum C++
    Réponses: 22
    Dernier message: 07/06/2008, 14h27
  3. [POO] Probleme avec static et autoload
    Par laetyboop dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2006, 14h46
  4. Réponses: 6
    Dernier message: 25/01/2006, 14h19
  5. compilation avec -static
    Par vince3320 dans le forum C
    Réponses: 2
    Dernier message: 08/12/2005, 15h30

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