Comment obtenir le nom de la classe en PHP?

99
public class MyClass {

}

En Java, nous pouvons obtenir le nom de la classe avec String className = MyClass.class.getSimpleName();

Comment faire cela en PHP? Je sais déjà get_class(), mais cela ne fonctionne que pour les objets. Actuellement, je travaille dans Active Record. J'ai besoin d'une déclaration comme MyClass::className.

Rezan Achmad
la source
1
Pourriez-vous donner un exemple particulier quand cela pourrait être utile en PHP? Si vous avez codé en dur le nom de la classe, vous pouvez le mettre entre guillemets et obtenir ce que vous voulez.
zerkms
2
Malheureusement, les refactorisations automatiques (par exemple dans les IDE) comme RenameClass ne renomme généralement pas ces chaînes de nom de classe. Par conséquent, ce serait bien d'avoir une sorte de moyen statique pour obtenir le nom de la classe, à part faire la public $__CLASS__ = __CLASS__;danse avec toutes les autres classes ...
EricSchaefer

Réponses:

114

Depuis PHP 5.5, vous pouvez utiliser la résolution de nom de classe via ClassName :: class .

Voir les nouvelles fonctionnalités de PHP5.5 .

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

Si vous souhaitez utiliser cette fonctionnalité dans votre méthode de classe, utilisez static :: class :

<?php

namespace Name\Space;

class ClassName {
   /**
    * @return string
    */
   public function getNameOfClass()
   {
      return static::class;
   }
}

$obj = new ClassName();
echo $obj->getNameOfClass();

?>

Pour les anciennes versions de PHP , vous pouvez utiliser get_class () .

Dado
la source
5
Quelle est la différence entre static::classet get_class_name()?
Alexander Jank
1
@AlexanderJank Il semble que ce static::classsoit résolu pendant la compilation alors qu'il get_class_name()est interprété pendant l'exécution. Je trouve cela en essayant d'accéder à la propriété :: classe d'une classe générée dynamiquement et obtenir l'erreur suivante (?): Dynamic class names are not allowed in compile-time ::class fetch. Voir cette réponse pour plus de détails. J'ai également trouvé cette note de la documentation utile.
cjsimon
29

Vous pouvez utiliser __CLASS__dans une classe pour obtenir le nom.

http://php.net/manual/en/language.constants.predefined.php

Brad
la source
3
vous pouvez également jeter un oeil ici pour voir tous les const intéressants: php.net/manual/en/language.constants.predefined.php
MatRt
Merci à @Brad pour le lien, je trouve la réponse ici
Rezan Achmad
2
@ user1073122, c'est le lien auquel j'ai lié dans ma réponse.
Brad
+1 car j'essayais d'obtenir le nom de la classe dans une méthode définie dans la classe parent. D'autres solutions ( get_class($this), static::class) retourne simplement le nom de la classe enfant (qui étend le parent).
akinuri
suite :, self::classaussi, semble renvoyer le nom de la classe parente.
akinuri
23

On dirait que vous avez répondu à votre propre question. get_classvous obtiendrez le nom de la classe. C'est procédural et c'est peut-être ce qui cause la confusion. Jetez un œil à la documentation php pourget_class

Voici leur exemple:

 <?php

 class foo 
 {
     function name()
     {
         echo "My name is " , get_class($this) , "\n";
     }
 }

 // create an object
 $bar = new foo();

 // external call
 echo "Its name is " , get_class($bar) , "\n"; // It's name is foo

 // internal call
 $bar->name(); // My name is foo

Pour que cela ressemble davantage à votre exemple, vous pouvez faire quelque chose comme:

 <?php

 class MyClass
 {
       public static function getClass()
       {
            return get_class();
       }
 }

Maintenant vous pouvez faire:

 $className = MyClass::getClass();

Ceci est quelque peu limité, cependant, car si ma classe est étendue, elle retournera toujours «MyClass». Nous pouvons utiliser à la get_called_classplace, qui repose sur la liaison statique tardive , une fonctionnalité relativement nouvelle, et nécessite PHP> = 5.3.

<?php

class MyClass
{
    public static function getClass()
    {
        return get_called_class();
    }

    public static function getDefiningClass()
    {
        return get_class();
    }
}

class MyExtendedClass extends MyClass {}

$className = MyClass::getClass(); // 'MyClass'
$className = MyExtendedClass::getClass(); // 'MyExtendedClass'
$className = MyExtendedClass::getDefiningClass(); // 'MyClass'
Aucun
la source
Merci @ J.Money pour l'idée .. Mais cela ne fonctionne pas en héritage.
Rezan Achmad
11

Maintenant, j'ai la réponse à mon problème. Merci à Brad pour le lien, je trouve la réponse ici . Et merci à J.Money pour l'idée. Ma solution:

<?php

class Model
{
    public static function getClassName() {
        return get_called_class();
    }
}

class Product extends Model {}

class User extends Model {}

echo Product::getClassName(); // "Product" 
echo User::getClassName(); // "User" 
Rezan Achmad
la source
3
Cela n'a aucun sens. FooBar::getClassName()est toujours 'FooBar'. Si vous pouviez taper Product::getClassName(), vous pourriez aussi taper à la 'Product'place.
zerkms
7
Oui, je sais .. Je veux éviter les fautes de frappe et aussi lors de la refactorisation du nom de la classe (avec les outils IDE), je n'ai pas besoin de rechercher et de remplacer la chaîne.
Rezan Achmad
Cela peut également vous aider si vous devez utiliser le nom de classe de la classe enfant dans la classe parent "Model".
JR Lawhorne
9

Pour obtenir le nom de la classe, vous pouvez utiliser ReflectionClass

class MyClass {
    public function myNameIs(){
        return (new \ReflectionClass($this))->getShortName();
    }
}
Omar Makled
la source
Bien que cet extrait de code puisse être la solution, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
yivi
Absolument spécial !!! C'est une solution SUPER mais simple! Merci !!!!
Simone Campagna
4

Il semble que ReflectionClassc'est une option assez productive.

class MyClass {
    public function test() {
        // 'MyClass'
        return (new \ReflectionClass($this))->getShortName();
    }
}

Référence:

Method Name      Iterations    Average Time      Ops/second
--------------  ------------  --------------    -------------
testExplode   : [10,000    ] [0.0000020221710] [494,518.01547]
testSubstring : [10,000    ] [0.0000017177343] [582,162.19968]
testReflection: [10,000    ] [0.0000015984058] [625,623.34059]

Илья Зеленько
la source
3

Je pense qu'il est important de mentionner peu de différence entre «soi» et «statique» en PHP, car la «meilleure réponse» utilise «statique», ce qui peut donner des résultats déroutants pour certaines personnes.

<?php
class X {
    function getStatic() {
        // gets THIS class of instance of object
        // that extends class in which is definied function
        return static::class;
    }
    function getSelf() {
        // gets THIS class of class in which function is declared
        return self::class;
    }
}

class Y extends X {
}
class Z extends Y {
}

$x = new X();
$y = new Y();
$z = new Z();

echo 'X:' . $x->getStatic() . ', ' . $x->getSelf() . 
    ', Y: ' . $y->getStatic() . ', ' . $y->getSelf() . 
    ', Z: ' . $z->getStatic() . ', ' . $z->getSelf();

Résultats:

X: X, X
Y: Y, X
Z: Z, X
JerzySkalski
la source
2

end(preg_split("#(\\\\|\\/)#", Class_Name::class))

Class_Name::class: renvoie la classe avec l'espace de noms. Donc, après avoir seulement besoin de créer un tableau, obtenez la dernière valeur du tableau.

AppelMarl
la source
0
<?php
namespace CMS;
class Model {
  const _class = __CLASS__;
}

echo Model::_class; // will return 'CMS\Model'

pour les versions antérieures à PHP 5.5

23Étoiles
la source
0
echo substr(strrchr(__CLASS__, "\\"), 1);    
Lukas Correa
la source