Динамическое пространство имен PHP-классов

Как я могу автоматически получить пространство имен классов?

Магия var __NAMESPACE__ является ненадежной, поскольку в подклассах она неверно определена.

Пример:

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

class Ping\pong\B extends Foo\bar\A -> __NAMESPACE__ === Foo \ bar (это должен быть Ping \ pong)

ps: Я заметил такое же неправильное поведение, используя __CLASS__ , но я решил использовать get_called_class() … есть что-то вроде get_called_class_namespace() ? Как я могу реализовать такую ​​функцию?

ОБНОВИТЬ:
Я думаю, что решение в моем собственном вопросе, так как я понял, что get_called_class() возвращает полное имя класса, и поэтому я могу извлечь из него пространство имен: D … В любом случае, если есть более эффективный подход, дайте мне знать;)

Solutions Collecting From Web of "Динамическое пространство имен PHP-классов"

Пространство имен class Foo\Bar\AFoo\Bar , поэтому __NAMESPACE__ работает очень хорошо. То, что вы ищете, вероятно, именное имя класса, которое вы можете легко получить, присоединив echo __NAMESPACE__ . '\\' . __CLASS__; echo __NAMESPACE__ . '\\' . __CLASS__; ,

Рассмотрим следующий пример:

 namespace Foo\Bar\FooBar; use Ping\Pong\HongKong; class A extends HongKong\B { function __construct() { echo __NAMESPACE__; } } new A; 

Foo\Bar\FooBar что очень правильно …

И даже если вы это сделаете

 namespace Ping\Pong\HongKong; use Foo\Bar\FooBar; class B extends FooBar\A { function __construct() { new A; } } 

он будет эхом Foo\Bar\FooBar , что опять же очень правильно …

EDIT: если вам нужно получить пространство имен вложенного класса внутри основного, вложенного в него, просто используйте:

 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), '\\')); } } 

В PHP 5.5 доступен класс :: class, который упрощает работу в 10 раз. Например, A::class