如何检测PHP中使用的最后一个命名空间?

时间:2012-01-13 19:35:35

标签: php class namespaces

如果我在单独的命名空间(以及它们的文件)中有两个类,并且它们都在全局命名空间中调用了一个函数 - 有没有办法来识别哪个命名空间调用该函数而不是传递该值?

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__ constant。但这是到位计算所以它不会解决这个问题。

2 个答案:

答案 0 :(得分:2)

您可以在每个命名空间中定义函数的版本,然后调用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 :(得分:1)

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()时才有效。