如果我在单独的命名空间(以及它们的文件)中有两个类,并且它们都在全局命名空间中调用了一个函数 - 有没有办法来识别哪个命名空间调用该函数而不是传递该值?
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。但这是到位计算所以它不会解决这个问题。
答案 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()时才有效。