有没有办法在PHP中获取引用函数的名称?

时间:2009-09-15 02:50:35

标签: php function

我有一个通常在其他函数内部调用的函数,我希望能够自动找出引用函数的名称(如果有的话)。

这样的事情:

function do_something()
{
    do_something_else();
}

function do_something_else()
{
    echo referring_function(); // prints 'do_something'
}

有没有简单的方法可以做到这一点?请注意,我知道可以通过将名称作为参数传递来手动完成,但我想知道是否有更简单的方法。另外,我不是在寻找__FUNCTION__常量,因为它返回调用它的函数的名称。我想要调用当前函数的函数的名称。

3 个答案:

答案 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'];
}