在PHP中如何获取函数内部的函数名?

273

有可能吗?

function test()
{
  echo "function name is test";
}

2
只是出于好奇,什么时候需要这样做?是否可能创建您不知道名称的函数? - DisgruntledGoat
39
可能的一个用途是记录你的执行过程。比如,如果你将"I had an error in " . __FUNCTION__写入日志文件或其他地方,这样,如果函数名被更改,你就不必担心那个人是否记得更改日志信息。请注意保持原文意思并尽量使翻译通俗易懂。 - Brian Ramsay
1
需要这个来记录日志!谢谢你的询问 :) - Rick Kukiela
2
如果你想在函数内部再次使用函数名称(进行其他操作),例如基于该函数构建链接等,则以下内容也非常有用。如果你有很多函数需要使用相同的模板,那么这种方法将节省大量时间。(例如:function name1() 然后再次使用 name1 - Mafia
1
@DisgruntledGoat:如果您手动创建函数并且不想为每个函数编辑错误消息,则这很有用。将其添加到错误消息中意味着您的工作量更少。 - John Boe
显示剩余3条评论
4个回答

443

准确的方法是使用__FUNCTION__ 预定义魔术常量

示例:

class Test {
    function MethodA(){
        echo __FUNCTION__;
    }
}

结果:

结果:MethodA


6
FUNCTION 同样适用于非类函数。在 PHP 7.0.8 上已经尝试过了。 - mvsagar
同样的方法,如何获取类名? - Kiran Reddy
3
也有一个魔法常量可以实现这个功能:__CLASS__。或者你可以使用 get_class($this) - Sean the Bean
1
尝试在 PHP >= 4 上运行。 - Nabi K.A.Z.

104

根据是方法还是函数,您可以使用魔术常量 __METHOD__ (包括类名)或 __FUNCTION__ (仅函数名)... =)


45
METHOD 包括类名,而 FUNCTION 只是函数名。后者同样可以在类的方法中使用。 - Alister Bulman
3
没错,但是有时候获取 MyClass::methodName 要比获取 methodName 更加有用。 - PatrikAkerstrand
METHOD 不一定返回类名;如果调用它的位置在 trait 内部,你将得到 trait 名称。如果你想获取实例使用的类名,请使用 get_class($this) - Jonny
1
@Jonny:Traits是在2012年的PHP 5.4中引入的,因此在2009年撰写此答案时它们并不存在。请随意建议编辑以更新有关PHP现在的工作方式的答案。 - PatrikAkerstrand

19

如果你正在使用 PHP 5,你可以尝试这样做:

function a() {
    $trace = debug_backtrace();
    echo $trace[0]["function"];
}

17
这非常消耗资源。使用__FUNCTION__或__METHOD__更为高效。但如果需要的不仅仅是函数名,debug_backtrace()也是一个很好的选择。 - Luke Cousins
2
使用 debug_backtrace() 进行此操作是一种不良实践。 - Marcio Mazzucato
1
这是我找到的唯一正确的方法!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! 因为__FUNCTION__返回父函数名称(当当前函数包含在父函数中时)。 - T.Todua
5
可以,请问您需要什么样的例子? - alds

2
<?php

  class Test {
     function MethodA(){
         echo __FUNCTION__ ;
     }
 }
 $test = new Test;
 echo $test->MethodA();
?>

结果: "MethodA";


虽然这段代码片段可能是解决方案,但包括解释真的有助于提高您的帖子质量。请记住,您正在回答未来读者的问题,而这些人可能不知道您提出代码建议的原因。 - SilverNak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接