Как я могу автоматически получить пространство имен классов?
Магия 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 … В любом случае, если есть более эффективный подход, дайте мне знать;)
Пространство имен class Foo\Bar\A
– Foo\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