Wie bekomme ich den Klassennamen in PHP?

99
public class MyClass {

}

In Java können wir Klassennamen mit erhalten String className = MyClass.class.getSimpleName();

Wie geht das in PHP? Ich weiß get_class()es bereits , aber es funktioniert nur für Objekte. Derzeit arbeite ich in Active Record. Ich brauche eine Aussage wie MyClass::className.

Rezan Achmad
quelle
1
Könnten Sie ein bestimmtes Beispiel nennen, wenn es in PHP hilfreich sein könnte? Wenn Sie den Klassennamen fest codiert haben, können Sie ihn in Anführungszeichen setzen und erhalten, was Sie möchten.
Zerkms
2
Leider benennen automatische Refactorings (z. B. in IDEs) wie RenameClass solche Klassennamenzeichenfolgen normalerweise nicht um. Daher wäre es schön, eine statische Methode zu haben, um den Klassennamen zu erhalten, abgesehen davon, dass Sie public $__CLASS__ = __CLASS__;mit jeder anderen Klasse tanzen ...
EricSchaefer

Antworten:

114

Seit PHP 5.5 können Sie die Auflösung von Klassennamen über ClassName :: class verwenden .

Siehe neue Funktionen von PHP5.5 .

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

Wenn Sie diese Funktion in Ihrer Klassenmethode verwenden möchten, verwenden Sie static :: class :

<?php

namespace Name\Space;

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

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

?>

Für ältere Versionen von PHP können Sie get_class () verwenden .

Dado
quelle
5
Was ist der Unterschied zwischen static::classund get_class_name()?
Alexander Jank
1
@AlexanderJank Es scheint, als ob static::classes während der Kompilierungszeit aufgelöst get_class_name()wird, während es zur Laufzeit interpretiert wird. Ich habe dies herausgefunden, indem ich versucht habe, auf die :: class-Eigenschaft (?) Einer dynamisch generierten Klasse zuzugreifen und den folgenden Fehler erhalten habe : Dynamic class names are not allowed in compile-time ::class fetch. Siehe diese Antwort für weitere Details. Ich fand diesen Hinweis auch aus den Dokumenten hilfreich.
Cjsimon
29

Sie können __CLASS__innerhalb einer Klasse verwenden, um den Namen zu erhalten.

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

Brad
quelle
3
Sie können auch einen Blick hier werfen, um alle interessanten const: php.net/manual/en/language.constants.predefined.php
MatRt
Vielen Dank an @Brad für den Link, ich finde die Antwort hier
Rezan Achmad
2
@ user1073122, Das ist der Link, auf den ich in meiner Antwort verlinkt habe.
Brad
+1, als ich versuchte, den Klassennamen in einer Methode abzurufen, die in der übergeordneten Klasse definiert ist. Andere Lösungen ( get_class($this), static::class) geben einfach den untergeordneten Klassennamen (der den übergeordneten Namen erweitert) zurück.
Akinuri
Fortsetzung : self::classScheint auch den Namen der übergeordneten Klasse zurückzugeben.
Akinuri
22

Es hört sich so an, als hätten Sie Ihre eigene Frage beantwortet. get_classerhalten Sie den Klassennamen. Es ist prozedural und vielleicht ist es das, was die Verwirrung verursacht. Schauen Sie sich die PHP-Dokumentation für anget_class

Hier ist ihr Beispiel:

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

Um es Ihrem Beispiel ähnlicher zu machen, könnten Sie Folgendes tun:

 <?php

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

Jetzt können Sie tun:

 $className = MyClass::getClass();

Dies ist jedoch etwas eingeschränkt, da meine Klasse, wenn sie erweitert wird, immer noch 'MyClass' zurückgibt. Wir können get_called_classstattdessen eine relativ neue Funktion verwenden , die auf Late Static Binding beruht und PHP> = 5.3 erfordert.

<?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'
Keiner
quelle
Danke @ J.Money für die Idee. Aber es funktioniert nicht in der Vererbung.
Rezan Achmad
11

Jetzt habe ich eine Antwort auf mein Problem. Vielen Dank an Brad für den Link, die Antwort finde ich hier . Und danke an J.Money für die Idee. Meine Lösung:

<?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
quelle
3
Das macht keinen Sinn. FooBar::getClassName()ist immer 'FooBar'. Wenn Sie tippen könnten, könnten Product::getClassName()Sie 'Product'stattdessen auch tippen .
Zerkms
7
Ja, ich weiß. Ich möchte Tippfehler vermeiden und auch beim erneuten Faktorisieren des Klassennamens (mit IDE-Tools) muss ich die Zeichenfolge nicht suchen und ersetzen.
Rezan Achmad
Dies kann auch hilfreich sein, wenn Sie den Klassennamen der untergeordneten Klasse in der übergeordneten Klasse "Model" verwenden müssen.
JR Lawhorne
8

Um den Klassennamen zu erhalten, können Sie ReflectionClass verwenden

class MyClass {
    public function myNameIs(){
        return (new \ReflectionClass($this))->getShortName();
    }
}
Omar Makled
quelle
Während dieses Code-Snippet die Lösung sein kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage in Zukunft für Leser beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Yivi
Absolut besonders !!! Dies ist eine SUPER aber einfache Lösung! Danke !!!!
Simone Campagna
4

Es sieht so aus, als wäre ReflectionClasses eine ziemlich produktive Option.

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

Benchmark:

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]
Илья Зеленько
quelle
3

Ich denke, es ist wichtig, den kleinen Unterschied zwischen "Selbst" und "Statisch" in PHP zu erwähnen, da "Beste Antwort" "Statisch" verwendet, was einigen Leuten verwirrende Ergebnisse liefern kann.

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

Ergebnisse:

X: X, X
Y: Y, X
Z: Z, X
JerzySkalski
quelle
2

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

Class_Name::class: Gibt die Klasse mit dem Namespace zurück. Nachdem Sie nur ein Array erstellt haben, rufen Sie den letzten Wert des Arrays ab.

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

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

für älter als PHP 5.5

23Pstars
quelle
0
echo substr(strrchr(__CLASS__, "\\"), 1);    
Lukas Correa
quelle