Как я могу автоматически получить пространство имен классов?
Магия 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