Come ottengo il nome della classe in PHP?


99
public class MyClass {

}

In Java, possiamo ottenere il nome della classe con String className = MyClass.class.getSimpleName();

Come farlo in PHP? Lo so già get_class(), ma funziona solo per gli oggetti. Attualmente lavoro in Active Record. Ho bisogno di una dichiarazione del tipo MyClass::className.


1
Potresti fare un esempio particolare di quando potrebbe essere utile in php? Se hai codificato il nome della classe, puoi racchiuderlo tra virgolette e ottenere ciò che desideri.
zerkms

2
Sfortunatamente i refactoring automatici (ad esempio negli IDE) come RenameClass di solito non rinominano tali stringhe di nomi di classi. Pertanto sarebbe bello avere una sorta di modo statico per ottenere il nome della classe, oltre a fare il public $__CLASS__ = __CLASS__;ballo con ogni altra classe ...
EricSchaefer

Risposte:


114

A partire da PHP 5.5 puoi usare la risoluzione dei nomi delle classi tramite ClassName :: class .

Scopri le nuove funzionalità di PHP5.5 .

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

Se vuoi usare questa caratteristica nel tuo metodo di classe usa static :: class :

<?php

namespace Name\Space;

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

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

?>

Per le versioni precedenti di PHP , puoi usare get_class () .


5
Qual è la differenza tra static::classe get_class_name()?
Alexander Jank

1
@AlexanderJank Sembra che static::classvenga risolto durante la compilazione mentre get_class_name()viene interpretato durante il runtime. Ho trovato questo cercando di accedere alla proprietà di classe :: di una classe generata in modo dinamico e ottenere il seguente errore (?): Dynamic class names are not allowed in compile-time ::class fetch. Vedi questa risposta per maggiori dettagli. Ho trovato utile anche questa nota dalla documentazione.
cjsimon

29

Puoi usare __CLASS__all'interno di una classe per ottenere il nome.

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


3
si può anche dare un'occhiata qui per vedere tutti const interessante: php.net/manual/en/language.constants.predefined.php
MatRt

Grazie a @Brad per il link, trovo la risposta qui
Rezan Achmad

2
@ user1073122, Questo è il collegamento a cui ho collegato nella mia risposta.
Brad

+1 mentre stavo cercando di ottenere il nome della classe in un metodo definito nella classe genitore. Altre soluzioni ( get_class($this), static::class) restituisce semplicemente il nome della classe figlio (che estende il genitore).
akinuri

continua :, self::classinoltre, sembra restituire il nome della classe genitore.
akinuri

22

Sembra che tu abbia risposto alla tua stessa domanda. get_classti darà il nome della classe. È procedurale e forse questo è ciò che sta causando la confusione. Dai un'occhiata alla documentazione php perget_class

Ecco il loro esempio:

 <?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

Per renderlo più simile al tuo esempio potresti fare qualcosa del tipo:

 <?php

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

Ora puoi fare:

 $className = MyClass::getClass();

Questo è un po 'limitato, tuttavia, perché se la mia classe viene estesa restituirà ancora "MyClass". Possiamo get_called_classinvece usare , che si basa su Late Static Binding , una funzionalità relativamente nuova e richiede 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'

Grazie @ J.Money per l'idea .. Ma non funziona in eredità.
Rezan Achmad

11

Ora ho la risposta per il mio problema. Grazie a Brad per il link, trovo la risposta qui . E grazie a J.Money per l'idea. La mia soluzione:

<?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" 

3
Non ha senso. FooBar::getClassName()è sempre 'FooBar'. Se potessi digitare Product::getClassName(), allora potresti anche digitare 'Product'.
zerkms

7
Sì, lo so .. Voglio evitare errori di battitura e anche quando si rifatta il nome della classe (con strumenti IDE), non ho bisogno di cercare e sostituire la stringa.
Rezan Achmad,

Ciò potrebbe essere utile anche se è necessario utilizzare il nome della classe della classe figlia nella classe genitore "Modello".
JR Lawhorne

8

Per ottenere il nome della classe puoi usare ReflectionClass

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

Sebbene questo frammento di codice possa essere la soluzione, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
yivi

Assolutamente speciale !!! Questa è una soluzione SUPER ma semplice! Grazie !!!!
Simone Campagna

4

Sembra che ReflectionClasssia un'opzione piuttosto produttiva.

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

Prova delle prestazioni:

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]

3

Penso che sia importante menzionare una piccola differenza tra "self" e "static" in PHP poiché "best answer" usa "static" che può dare risultati confusi ad alcune persone.

<?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();

Risultati:

X: X, X
Y: Y, X
Z: Z, X

2

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

Class_Name::class: restituisce la classe con lo spazio dei nomi. Quindi, dopo aver creato solo un array, ottieni l'ultimo valore dell'array.


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

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

per versioni precedenti a PHP 5.5


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.