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


How to detect the last namespace used in PHP?

如果我在不同的命名空间中有两个类(以及相应的文件),并且它们都调用了全局命名空间中的一个函数,那么除了传递值之外,还有什么方法可以确定是哪个命名空间调用了该函数吗?

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__常量。但这是在中计算出来的,所以它不能解决这个问题。

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

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()时,它才可能工作。