【问题标题】:Is it possible to get the name of a function by it's reference? [duplicate]是否可以通过引用来获取函数的名称? [复制]
【发布时间】:2013-07-26 15:29:37
【问题描述】:

我有以下代码:

function abcdef() { }

function test($callback) {
    // I need the function name string("abcdef") here?
}

test(abcdef);

是否可以在测试函数中获取函数名? 那么匿名函数呢?

【问题讨论】:

  • 为什么不直接将字符串传递给函数?
  • 可以使用 PHP 5.3+ 匿名函数:php.net/manual/en/functions.anonymous.php
  • 您的代码将引发语法错误。您应该将 abcdef 作为字符串 (test('abcdef');) 传递。然后你可以echo $callback;。当你想调用它时,$callback();.

标签: php callback


【解决方案1】:

以前有人问过这个问题:How can I get the callee in PHP?

您可以通过debug_backtace 获取您需要的信息。这是一个非常干净的函数I have found

<?php
/**
 * Gets the caller of the function where this function is called from
 * @param string what to return? (Leave empty to get all, or specify: "class", "function", "line", "class", etc.) - options see: http://php.net/manual/en/function.debug-backtrace.php
 */
function get_caller($what = NULL)
{
    $trace = debug_backtrace();
    $previousCall = $trace[2]; // 0 is this call, 1 is call in previous function, 2 is caller of that function

    if(isset($what)) {
        return $previousCall[$what];
    } else {
        return $previousCall;
    }   
}

你(可能)这样使用它:

<?php
function foo($full)
{
    if ($full) {
        return var_export(get_caller(), true);
    } else {
        return 'foo called from ' . get_caller('function') . PHP_EOL;
    }
}

function bar($full = false)
{
    return foo($full);
}

echo bar();
echo PHP_EOL;
echo bar(true);

返回:

foo called from bar

array (
  'file' => '/var/www/sentinel/caller.php',
  'line' => 31,
  'function' => 'bar',
  'args' =>
  array (
    0 => true,
  ),
)

【讨论】:

  • 请注意,debug_backtrace() 被认为非常慢并且不适合生产。
  • 确实很慢,但这种检查方式很有用。计算机也总是越来越快,这在以后肯定不会被认为是慢。
  • 关键不在于计算机有多快。与 PHP 所做的其他事情相比,它的速度有多慢。它现在而且总是会非常缓慢并且不适合生产。
  • 你可能就在这里。但是,如果开发人员设计的网站确实需要它,那么他们应该让它运行缓慢。
【解决方案2】:

你可以试试 function.name :

function abcdef() { }

function test($callback) {
    alert($callback.name)
}

test(abcdef);

【讨论】:

  • OP 已将他的问题标记为“PHP”而不是 JS
  • 上面的代码是php,不是javascript
  • @Wiseguy 我认为他的评论是他的原始帖子是 PHP 代码,而不是像提供的答案那样的 JS。
  • @cspray 我的错。我以为那是回答者的回答,而不是提问者的回答。删除了我之前的评论。
  • 天哪。我非常非常累。我的错。对不起
猜你喜欢
  • 2023-03-24
  • 2016-06-22
  • 2017-10-01
  • 2017-03-06
  • 1970-01-01
  • 2014-05-19
  • 2016-01-23
  • 2015-06-15
  • 2021-08-02
相关资源
最近更新 更多