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