在PHP中从方法内部获取方法名称

82
可以做这样的事情吗?
public function something() {
    $thisMethodName = method_get_name(); 
}

method_get_name() 返回方法本身的名称。

8个回答

139
当然,您想要魔法常量。
function myFunction() { print __FUNCTION__." in ".__FILE__." at ".__LINE__."\n"; }

PHP手册中了解更多信息。


45
而且,为了有点调皮,方法名称的魔术常量是:__METHOD__ - Anthony
46
虽然有些晚了,但我还是很惊讶地发现 __METHOD__ 实际上返回的是 Class::method,所以 __FUNCTION__ 只返回方法名称……对于像我一样仍然不喜欢读手册的人来说,这很重要。 - Chords

28
虽然你可以使用魔术常量`__METHOD__`,但我强烈建议你去了解一下PHP的反射。这在PHP5中得到支持。
$modelReflector = new ReflectionClass(__CLASS__);
$method = $modelReflector->getMethod(__METHOD__);

你可以做一些牛逼的事情,比如检查签名等。

当您说“检查签名”时,您的意思是这个吗?http://www.php.net/manual/en/function.openssl-verify.php - Hector Ordonez
@MrMe 不是,方法签名(不要与身份验证签名混淆)像这样:http://en.wikipedia.org/wiki/Type_signature - thesmart
好的,基本上就是类型提示。http://stackoverflow.com/questions/2161040/is-method-signature-in-php-a-must-or-should 谢谢! - Hector Ordonez

14

正如smartj所建议的那样,您可以尝试使用神奇常量__METHOD__,但请记住,它将返回一个包含类名的字符串,例如'MyClass::something'。 改用__FUNCTION__会返回'something'。


4

使用 __FUNCTION__ 我可以这样做:

protected static function getUserResponseByAccessTokenRequestOptions(string $myParam): array
{
    return array_merge(parent::{__FUNCTION__}($myParam), [
        'myValue' => '123'
    ]);
}

改为:

protected static function getUserResponseByAccessTokenRequestOptions(string $myParam): array
{
    return array_merge(parent::getUserResponseByAccessTokenRequestOptions($myParam), [
        'myValue' => '123'
    ]);
}

如果我想更改方法的名称,它不会在方法内部替换方法的名称。


这是一个很好的参考,也适用于像 self::{self::$some_method_name}(); :-) 这样的情况!但是它的文档在哪里呢?(我知道我在过去的几年中看到过它,只是记不清确切的名称了)(一般来说,我知道它是“变量函数”和“可变变量”的组合)。 - jave.web

3

使用__FUNCTION__是一个不错的选择,替代如下写法:

 public function something() {
     $thisMethodName = "something";
 }

这段代码存在多个问题,它添加了一个变量和内存以字符串形式存储方法名,并复制已经存在的内容,从而不必要地增加了资源使用量(如果你在一个具有许多方法的大型库中进行这样的操作,这将非常重要)。
PHP中的魔术常量保证不会更改,而这种方法需要适当地编辑,如果方法名被更改,则会引入潜在的不一致性(请注意,我说的是潜在的,这意味着如果使用魔术常量,则可以避免这种情况,因此否定了任何声称__FUNCTION__是不必要的观点)。
为变量命名、重新输入作为字符串分配给该变量的方法名以及正确引用变量名所需的时间和精力,正是PHP提供魔术常量的动机。

3
也许以这种方式缺少后期绑定。
当B类扩展A类时:
__METHOD__总是返回与A相关的“className ::”部分(A :: methodName)
解决方案是:

static::class."::".__FUNCTION__

以这种方式,您可以获取当前工作类的类引用(B :: methodName

1

虽然有点hack,但你也可以从debug_backtrace()的返回值中找到它。


如果您有一个需要调用它的函数名称的常见日志记录函数,那么这可能是正确的方法。 - user9645

-7

为什么你不能做这个?

public function something() {
    $thisMethodName = "something";
}

8
__FUNCTION__可用时,这完全是不必要的。 - too much php
1
很好 - 但是以同样的精神,我可以认为`__FUNCTION__是不必要的 :) - Andrew Hare
6
如果这个方法被赋予一个新名称,开发人员可能会忘记更新变量内容,这将是危险的。 - Marcio Mazzucato

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