2015-01-28 1 views
3

У меня есть некоторый код, такой как:Получить пространство имен объекта с использованием абстрактного класса или признака?

namespace { 
    trait ns{ 
    public function get_ns(){ 
     var_dump(__NAMESPACE__); 
    } 
    } 
} 

namespace a{ 
    class obj{ 
    use \ns; 
    } 
} 

namespace b{ 
    class obj{ 
    use \ns; 
    } 
} 

namespace { 
    $a = new a\obj; 
    $b = new b\obj; 

    $a->get_ns(); 
    $b->get_ns(); 
} 

Оба $a->get_ns(); и $b->get_ns(); дамп string(0) "" вместо string(1) "a" и string(1) "b". Поведение такое же, если я использую абстрактный класс вместо признака.

Это (очевидно), потому что класс признака/абстрактного класса был объявлен в пространстве имен имен, однако я хотел бы, чтобы класс признаков/абстрактных дампов занимал пространство имен реальных объектов (a и b).

Есть ли способ сделать это без создания этой функции в каждом объекте и без прохождения __NAMESPACE__ в качестве аргумента для get_ns()?

ответ

6

Используйте reflection api:

var_dump((new \ReflectionObject($this))->getNamespaceName()); 

Это та вещь, это сделано для.

+0

Это тоже определенно работает. Благодарю. –

3

Вы можете получить пространство имен из $this:

$class = get_class($this); 
$ns = substr($class, 0, strrpos($class, '\\')); 
+0

Это определенно работает. Благодарю. –

Смежные вопросы