public class MyClass {
}
W Javie możemy uzyskać nazwę klasy za pomocą String className = MyClass.class.getSimpleName();
Jak to zrobić w PHP? Już wiem get_class()
, ale działa tylko dla obiektów. Obecnie pracuję w Active Record. Potrzebuję oświadczenia w stylu MyClass::className
.
public $__CLASS__ = __CLASS__;
tańca z każdą inną klasą ...Odpowiedzi:
Od PHP 5.5 możesz używać rozwiązywania nazw klas poprzez ClassName :: class .
Zobacz nowe funkcje PHP5.5 .
Jeśli chcesz użyć tej funkcji w swojej metodzie klasowej, użyj static :: class :
W przypadku starszych wersji PHP możesz użyć metody get_class () .
źródło
static::class
iget_class_name()
?static::class
to, że problem został rozwiązany podczas kompilacji, podczas gdyget_class_name()
jest interpretowany w czasie wykonywania. Znalazłem to przez próby dostępu do :: klasę właściwość dynamicznie generowanej klasy i otrzymuję następujący błąd (?)Dynamic class names are not allowed in compile-time ::class fetch
. Zobacz tę odpowiedź, aby uzyskać więcej informacji. Również ta notatka z dokumentów była pomocna.Możesz użyć
__CLASS__
w klasie, aby uzyskać nazwę.http://php.net/manual/en/language.constants.predefined.php
źródło
get_class($this)
,static::class
) po prostu zwracają nazwę klasy podrzędnej (rozszerzającej klasę nadrzędną).self::class
wydaje się również zwracać nazwę klasy nadrzędnej.Wygląda na to, że odpowiedziałeś na własne pytanie.
get_class
poda Ci nazwę klasy. Jest to proceduralne i być może to właśnie powoduje zamieszanie. Zapoznaj się z dokumentacją php dotyczącąget_class
Oto ich przykład:
Aby bardziej przypominać Twój przykład, możesz zrobić coś takiego:
Teraz możesz:
Jest to jednak nieco ograniczone, ponieważ jeśli moja klasa zostanie rozszerzona, nadal będzie zwracać „MyClass”.
get_called_class
Zamiast tego możemy użyć funkcji Late Static Binding , która jest stosunkowo nową funkcją i wymaga PHP> = 5.3.źródło
Teraz mam odpowiedź na mój problem. Dzięki Bradowi za link, odpowiedź znajduję tutaj . Dziękuję J.Money za pomysł. Moje rozwiązanie:
źródło
FooBar::getClassName()
jest zawsze'FooBar'
. Gdybyś mógł pisaćProduct::getClassName()
- możesz też'Product'
zamiast tego pisać .Aby uzyskać nazwę klasy, możesz użyć ReflectionClass
źródło
Wygląda na to, że
ReflectionClass
jest to całkiem produktywna opcja.Reper:
źródło
Myślę, że ważne jest, aby wspomnieć o niewielkiej różnicy między „własnym” a „statycznym” w PHP, ponieważ „najlepsza odpowiedź” wykorzystuje słowo „statyczne”, co może niektórym wydawać się mylące.
Wyniki:
źródło
end(preg_split("#(\\\\|\\/)#", Class_Name::class))
Class_Name::class
: zwraca klasę z przestrzenią nazw. Więc po utworzeniu tylko tablicy, pobierz ostatnią wartość tablicy.źródło
dla starszych niż PHP 5.5
źródło
źródło