代码之家  ›  专栏  ›  技术社区  ›  Josh Leitzel

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

  •  4
  • Josh Leitzel  · 技术社区  · 15 年前

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

    像这样:

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

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

    3 回复  |  直到 11 年前
        1
  •  10
  •   Mike-O    11 年前

    你可以滥用 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();
    }
    
        2
  •  0
  •   Lukman    15 年前

    可能强制调用函数将其名称放入某个函数参数中。类似:

    function do_something()
    {
        do_something_else(__FUNCTION__);
    }
    
    function do_something_else($calling)
    {
        echo $calling; // prints 'do_something'
    }
    

    但是还没有测试。

        3
  •  0
  •   Václav    11 年前
    function callerId(){
      $trace = debug_backtrace();
      return $trace[2]['function'];
    }
    

    它运行正常,即使它在任何类中使用——但在那里它受到类的限制。它不会超出类的范围——超过一个级别(例如,如果您将在准备异常调用的函数中使用它,它将只在调用它的地方调用函数)。

    对于这个函数,这里有一个小的改进,它会自动获得最高级别——如果它是零或十(但另一方面,谁会创建这样的结构,那么它会有这么多的级别)。

    protected function Get_CallerFunctionName()
    {
        $Function = debug_backtrace();
        $Level = count($Function)-1;
        return $Function[$Level]['function'];
    }