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
.
public $__CLASS__ = __CLASS__;
mit jeder anderen Klasse tanzen ...Antworten:
Seit PHP 5.5 können Sie die Auflösung von Klassennamen über ClassName :: class verwenden .
Siehe neue Funktionen von PHP5.5 .
Wenn Sie diese Funktion in Ihrer Klassenmethode verwenden möchten, verwenden Sie static :: class :
Für ältere Versionen von PHP können Sie get_class () verwenden .
quelle
static::class
undget_class_name()
?static::class
es während der Kompilierungszeit aufgelöstget_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.Sie können
__CLASS__
innerhalb einer Klasse verwenden, um den Namen zu erhalten.http://php.net/manual/en/language.constants.predefined.php
quelle
get_class($this)
,static::class
) geben einfach den untergeordneten Klassennamen (der den übergeordneten Namen erweitert) zurück.self::class
Scheint auch den Namen der übergeordneten Klasse zurückzugeben.Es hört sich so an, als hätten Sie Ihre eigene Frage beantwortet.
get_class
erhalten 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:
Um es Ihrem Beispiel ähnlicher zu machen, könnten Sie Folgendes tun:
Jetzt können Sie tun:
Dies ist jedoch etwas eingeschränkt, da meine Klasse, wenn sie erweitert wird, immer noch 'MyClass' zurückgibt. Wir können
get_called_class
stattdessen eine relativ neue Funktion verwenden , die auf Late Static Binding beruht und PHP> = 5.3 erfordert.quelle
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:
quelle
FooBar::getClassName()
ist immer'FooBar'
. Wenn Sie tippen könnten, könntenProduct::getClassName()
Sie'Product'
stattdessen auch tippen .Um den Klassennamen zu erhalten, können Sie ReflectionClass verwenden
quelle
Es sieht so aus, als wäre
ReflectionClass
es eine ziemlich produktive Option.Benchmark:
quelle
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.
Ergebnisse:
quelle
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.quelle
für älter als PHP 5.5
quelle
quelle