2012-12-18 14 views
7

Jak mogę automatycznie pobrać nazw klasy?Uzyskaj klasy nazw PHP dynamicznie

Magia var __NAMESPACE__ jest zawodna, ponieważ w podklasy nie jest poprawnie zdefiniowany.

przykład:

class Foo\bar\A ->__NAMESPACE__ === Foo \ bar

class Ping\pong\B extends Foo\bar\A ->__NAMESPACE__ === Foo \ bar (należy ping \ pong)

PS: zauważył tak samo złe zachowanie używając __CLASS__, ale rozwiązany za pomocą get_called_class() ... jest tam coś get_called_class_namespace()? Jak mogę wdrożyć taką funkcję?

UPDATE:
Myślę, że rozwiązanie jest w moim pytaniu, ponieważ zdałem sobie sprawę get_called_class() Zwraca w pełni kwalifikowaną nazwę klasy, a więc mogę wydobyć z niej nazw: D ... W każdym razie, jeśli nie jest bardziej skuteczna podejście daj mi znać;)

+0

Twoje rozwiązanie jest to, co miałem zrobić w kodzie osobistego. http://codepad.viper-7.com/EgObtf –

+0

To, co opisujesz, nie jest niewłaściwym zachowaniem. Zobacz, jakie są te stałe: http://php.net/language.constants.predefined - a ponieważ znalazłeś rozwiązanie swojego problemu, możesz odpowiedzieć na własne pytanie. – hakre

+0

Sprawdź to. Myślę, że to, co masz na myśli: http://stackoverflow.com/questions/2317343/get-child-class-namespace-from-superclass-in-php/20193599#20193599 – Chris

Odpowiedz

9

Przestrzeń nazw class Foo\Bar\A to Foo\Bar, więc __NAMESPACE__ działa bardzo dobrze. Co szukasz jest prawdopodobnie przestrzeni nazw classname że można łatwo uzyskać przez dołączenie echo __NAMESPACE__ . '\\' . __CLASS__;.

Rozważmy kolejny przykład:

namespace Foo\Bar\FooBar; 

use Ping\Pong\HongKong; 

class A extends HongKong\B { 

    function __construct() { 
     echo __NAMESPACE__; 
    } 
} 

new A; 

wypisze Foo\Bar\FooBar który jest bardzo poprawna ...

I nawet jeśli potem zrobić

namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     new A; 
    } 
} 

będzie echo Foo\Bar\FooBar, który ponownie jest bardzo poprawna ...

EDIT: Jeśli trzeba uzyskać przestrzeń nazw pod-klasy w ciągu głównym, który jest zagnieżdżanie, wystarczy użyć:

namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     $a = new A; 
     echo $a_ns = substr(get_class($a), 0, strrpos(get_class($a), '\\')); 
    } 
} 
+3

oni używają \ _ \ _ NAMESPACE \ _ \ _ w klasie nadrzędnej, ale chcą przestrzeni nazw klasy podrzędnej. –

+0

Ahaa, nie dostałem tego od pytania ... – shadyyx

+0

@MaximilianRuta Cóż, dziękuję za edycję, ale proszę, w przyszłości popraw tylko to, co jest konieczne do poprawienia. Wszystkie wystąpienia ** Ty ** zmieniłeś na ** ty **? To jest mój styl pisania i pokazywania pewnych grzeczności, więc jeśli nie masz nic przeciwko, pozwól mi zachować swój styl wyrażania siebie. Dzięki! Dziękuję także recenzentom za zatwierdzenie takiego ** minor ** i nie tak ** poprawne ** edit request ... Well done! – shadyyx

9

W PHP 5.5 :: klasa jest dostępny która sprawia, że ​​rzeczy 10X łatwiejsze. Na przykład. A::class

+0

Przykład http://php.net/manual/en/language.oop5.constants.php#example-179 – Jekis

Powiązane problemy