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