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] Obtenir le nom de la classe actuelle


Sujet :

Langage PHP

  1. #1
    Membre chevronné Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par défaut [POO] Obtenir le nom de la classe actuelle
    Bonjour,

    J'ai deux classes A et B, B hérite de A.
    Je voudrais grâce à une méthode static déclarer dans A pouvoir récupérer le nom de la classe actuelle.

    J'ai essayé avec le code suivant :

    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
    <?php
    class A
    {
        static function get_name()
        {
           return __CLASS__;
        }
    }
     
    class B extends A
    {
     
    }
     
    echo B::get_name()
    ?>
    Mais ça m'affiche A !!

    Comment faire pour récupérer le nom de la classe avec laquelle est appellée la méthode static get_name() ?

  2. #2
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    en static je vois pas. sinon essaye

  3. #3
    Membre chevronné Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par défaut
    Et c'est bien ça mon problème...

    Avec $this un objet doit être instancié, ce que je ne veux pas.

    J'ai vue qu'il y avait un mot clé pour la classe actuelle qui est 'self'. Mais apparemment il sert uniquement à l'appel de méthode:
    Des idées?

  4. #4
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    si ton objet n'est pas instancié, je ne vois pas du tout comment php pourrais faire pour savoir de quel type il est.

  5. #5
    Membre chevronné Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par défaut
    si ton objet n'est pas instancié, je ne vois pas du tout comment php pourrais faire pour savoir de quel type il est.
    Exactement, mais je n'ai pas d'objet instanciés.
    Je veux savoir quelle classe fait appel à la méthode get_name().

    Par exemple :

    J'attends comme résultat 'B'. et non 'A' (comme dans mon exemple en haut).

    Je cherche une fonction qui m'indique le nom de la classe actuelle. Comme la variable magique __CLASS__ mais qui fonctionne aussi dans les classes dérivées.

  6. #6
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Comment faire pour récupérer le nom de la classe avec laquelle est appellée la méthode static get_name() ?
    Ca n'est pas possible actuellement. C'est une propriété qui fait débat dans la communauté des développeurs du core.

    Cependant, il existe un 'hack' reposant sur la fonction debug_backtrace. Voilà ce que ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class A {
      public static function get_name() {
        $t = debug_backtrace();
        $n = file($t[0]['file']);
        $l = $n[$t[0]['line'] - 1];
        preg_match('/[a-z_][a-z0-9_]*(?=::'.$t[0]['function'].')/i', $l, $m);
        return $m[0];
      }
    }
    class B extends A { }
    class C extends B { }
     
    echo B::get_name(); // B
    echo C::get_name(); // C
    Lis aussi ces très bons cours et tutoriels programmation PHP : http://php.developpez.com/cours/

  7. #7
    Membre chevronné Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par défaut
    Merci goodpz !
    Voudrais-tu me donner une description du fonctionnement de cette fonction?
    Parceque là... je suis dans le flou.

  8. #8
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Etant donné que la fonction get_name est déclarée en statique dans la classe A, ce me semble parfaitement logique que le fait d'appeler cette fonction depuis une classe fille de A retourne le réel "contexte" de la classe A, et non celui de la classe fille (vu qu'on a aucune instanciation d'objet).

    __CLASS__ étant une constante retournant le nom de la classe courante, tout cela me semble donc normal qu'il te retourne A.

    Enfin, pour moi, au-delà de ce hack, la méthode la plus conventionnelle serait de déclarer cette fonction get_name dans chacune des classes pour laquelle tu voudrais obtenir cette information (toujours en gardant en tête que tu ne désires pas d'instanciation)

    Mais je peux me tromper

  9. #9
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Voudrais-tu me donner une description du fonctionnement de cette fonction?
    Dans la fonction, fait des print_r() pour afficher les différentes variables. Tu vas mieux comprendre.

    Le principe c'est de récupérer le nom de la classe directement en 'lisant' la ligne concernée dans le fichier source, c'est à dire celui contenant l'instruction Class::function. Ca fonctionne (du moins avec les versions php5 actuelles), mais c'est un horrible hack. A déconseiller.

  10. #10
    Membre chevronné Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par défaut
    En effet ça fait pas très propre...

    De plus si les classes sont nomées dynamiquement, ça fonctionne pas.
    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $class = 'C';
    echo $class::get_name();
    C'est quand même dommage que les développeurs de php n'aient pas pensé à ça.

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    Comme l'a écrit bkill, pourquoi ne pas surcharger get_name dans chaque classe fille ?
    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
    class A { 
        static function get_name()  {
            return __CLASS__;
        }
    }
     
    class B extends A {
        static function get_name()  {
            return __CLASS__;
        }
    }
     
    echo B::get_name()
    ?>

Discussions similaires

  1. obtenir le nom de la classe dans une méthode static
    Par einboubou dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 13/11/2009, 16h46
  2. obtenir le nom de la classe
    Par robert_trudel dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 29/05/2008, 09h37
  3. [POO] Récupérer le nom de la classe d'un objet
    Par boux2 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/04/2007, 09h13
  4. Obtenir le nom d'une classe
    Par yapatchs dans le forum Langage
    Réponses: 10
    Dernier message: 26/09/2006, 11h37
  5. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44

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