【问题标题】:get function name that called function without arguments获取调用不带参数的函数的函数名
【发布时间】:2012-02-09 14:28:32
【问题描述】:

我有一个带有私有方法admin_form() 的类admin_model

还有许多其他公共函数调用此方法。

有没有办法从 INSIDE admin_form() 获取调用 admin_form() 的函数的名称?

我可以在调用admin_form() 时轻松添加一个参数,例如:

$this -> admin_form(__FUNCTION__);

然后在admin_form($caller) 里面我有来电者。它将是$caller

但我希望有一种方法可以在不传递参数的情况下做到这一点。

有什么想法吗??

干杯, 亚历克斯

【问题讨论】:

  • 表示你想要递归函数??
  • 你应该没有真正的理由这样做,这表明编码习惯不好......但是如果你需要一个函数来根据它的调用位置来做不同的事情,你可能会考虑使用命名空间函数

标签: php


【解决方案1】:

您可以使用debug_backtrace()

<?php
class admin_model {
    public function foo() {
        $this->admin_form();
    }

    public function bar() {
        $this->admin_form();
    }

    private function admin_form() {
        // Get the current call stack
        $stack = debug_backtrace();

        // Remove this call (admin_form()) from the stack
        array_shift($stack);

        // The calling method is now on the top of the stack
        $lastCall = array_shift($stack);
        $callingMethod = $lastCall['function'];

        echo "admin_form() called by method: $callingMethod\n";
    }
}

$model = new admin_model();
$model->foo();
$model->bar();

输出:

admin_form() called by method: foo
admin_form() called by method: bar

但是,正如其他人指出的那样,这是一种不好的做法,您应该重新考虑您的设计。

【讨论】:

    【解决方案2】:

    没关系,

    根据我的要求,这个功能比“糟糕的编码”更有用。

    反正答案是:

    $e = new Exception();
    $trace = $e -> getTrace();
    $caller = $trace[1]["function"];
    

    这将获得调用者的函数名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 2022-11-14
      相关资源
      最近更新 更多