我有一个通常在其他函数内部调用的函数,我希望能够自动找出引用函数的名称(如果有的话)。
这样的事情:
function do_something()
{
do_something_else();
}
function do_something_else()
{
echo referring_function(); // prints 'do_something'
}
有没有简单的方法可以做到这一点?请注意,我知道可以通过将名称作为参数传递来手动完成,但我想知道是否有更简单的方法。另外,我不是在寻找__FUNCTION__
常量,因为它返回调用它的函数的名称。我想要调用当前函数的函数的名称。
答案 0 :(得分:10)
你可以滥用debug_backtrace()
来做这件事。似乎应该有更好的方法......但我没想到它。
你想要做到这一点似乎有点奇怪。如果你真的需要一个函数来知道谁在调用它,你可能会遇到设计问题。
但是,如果你确定要这样做,你可以像这样定义一个小的全局函数:
function callerId(){
$trace = debug_backtrace();
return $trace[2]['function'];
}
这将始终返回调用调用它的函数的函数的名称。当然,除非从顶级脚本调用调用callerId()
的函数。
所以,一个用法示例:
function callerId(){
$trace = debug_backtrace();
return $trace[2]['function'];
}
function do_something(){
do_something_else();
}
function do_something_else(){
$who_called = callerId();
}
答案 1 :(得分:0)
可能强制调用函数将其名称放入其中一个函数参数中。类似的东西:
function do_something()
{
do_something_else(__FUNCTION__);
}
function do_something_else($calling)
{
echo $calling; // prints 'do_something'
}
虽然未经测试。
答案 2 :(得分:0)
function callerId(){
$trace = debug_backtrace();
return $trace[2]['function'];
}
它运行正常,即使它在任何类中使用 - 但它受到类的限制。它不会超出类 - 超过一个级别(例如,如果你将在一个准备异常调用的函数中使用它,它将只调用它被调用的函数)。
这是对该功能的微小改进,自动获得最高级别 - 如果它是零或十(但另一方面,谁会创建这样的结构,那将有这么多级别)。
protected function Get_CallerFunctionName()
{
$Function = debug_backtrace();
$Level = count($Function)-1;
return $Function[$Level]['function'];
}