Как определить последнее пространство имен, используемое в PHP? - PullRequest
1 голос
/ 13 января 2012

Если у меня было два класса в отдельных пространствах имен (и, следовательно, в файлах), и они оба вызывали функцию в глобальном пространстве имен - есть ли способ определить, какое пространство имен вызвало эту функцию, если не передать значение?

namespace A;
class Test { function run() { \func(); }

...

namespace B;
class Test { function run() { \func(); }

...

function func()
{
    // Did a class from "\A" call me or "\B"...?
}

Моей первой мыслью было использование константы __NAMESPACE__ . Но это вычисляется вместо , поэтому это не решит эту проблему.

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Вы можете определить версии функции в каждом пространстве имен, которое затем вызывает func ();

namespace A;
class Test { function run() { func(); }

...

namespace B;
class Test { function run() { func(); }

...

namespace A
{
    function func()
    {
        \func(__NAMESPACE__);
    }
}

namespace B
{
    function func()
    {
        \func(__NAMESPACE__);
    }
}

namespace 
{
    function func($namespace)
    {
        //work with $namespace
    }
}
1 голос
/ 13 января 2012

debug_backtrace () покажет вам стек вызовов. Это также дает вам имя класса объекта, из которого были сделаны вызовы. Вы можете разобрать эту дату и найти пространство имен.

http://www.php.net/manual/en/function.debug-backtrace.php

function func()
{
    $trace = debug_backtrace();
    $class = $trace[1]['class']; //Should be the class from the previous function

    $arr = explode($class, "\");
    array_pop($arr);
    $namespace = implode($arr, "\");
}

Дайте мне знать, если это работает. Вероятно, это будет работать, только если func () вызывается изнутри объекта или класса.

...