有没有办法获得引用函数';PHP中的名字是什么?

有没有办法获得引用函数';PHP中的名字是什么?,php,function,Php,Function,我有一个经常在其他函数中调用的函数,我希望能够自动找出引用函数(如果有的话)的名称 大概是这样的: function do_something() { do_something_else(); } function do_something_else() { echo referring_function(); // prints 'do_something' } function callerId(){ $trace = debug_backtrace();

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

大概是这样的:

function do_something()
{
    do_something_else();
}

function do_something_else()
{
    echo referring_function(); // prints 'do_something'
}
function callerId(){
    $trace = debug_backtrace();
    return $trace[2]['function'];
}

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

您可能会滥用
debug\u backtrace()
来执行此操作。看来应该有更好的办法。。。但我没有想到

你想这么做似乎有点奇怪。如果您确实需要一个函数来知道是谁在调用它,那么您可能会遇到设计问题

但是,如果您确定要执行此操作,可以定义一个如下的小全局函数:

function do_something()
{
    do_something_else();
}

function do_something_else()
{
    echo referring_function(); // prints 'do_something'
}
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();
}

可能会强制调用函数将其名称插入其中一个函数参数中。比如:

function do_something()
{
    do_something_else(__FUNCTION__);
}

function do_something_else($calling)
{
    echo $calling; // prints 'do_something'
}
但未经测试

function callerId(){
  $trace = debug_backtrace();
  return $trace[2]['function'];
}
即使在任何类中使用它,它也能正确运行——但在那里它受到类的限制。它不会超出类的范围-超过一个级别(例如,如果您在准备异常调用的函数中使用它,它将只在调用它的地方调用函数)

这是对该函数的一个小改进,它会自动获得顶级-如果是0或10级(但另一方面,谁会创建这样的结构,会有这么多级别)


我特别说过我不想手动输入,也不想使用这个函数。谢谢你的解决方案。你能详细解释一下为什么这可能是一个设计问题吗?这意味着你没有清晰地构建事物。函数应该抽象一些特定的进程,一般来说,应该只通过它传递的参数(输入)和它返回的值与“外部”通信。更常见的“危险信号”是函数依赖于某个全局变量。当涉及全局变量时,可能会出现异常,但我很难想象调用堆栈中包含信息的情况是合适的。这类信息是“魔法”,应该加以阻止。临时调试代码不算数。我理解你的意思。实际上,我还没有将其用于任何事情,但我认为它对于错误函数可能很有用。它可以说“错误在{function}:传递的文件不存在”之类的话。虽然可能有更好的方法来做到这一点,但老实说,我对错误处理的研究还不够深入。