您可以从PHP中的方法中获取方法名称吗?


71

是否可以做这样的事情?

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

method_get_name()返回方法的名字?

Answers:


118

当然,您需要魔术常数。

function myFunction() { print __FUNCTION__." in ".__FILE__." at ".__LINE__."\n"; }

php手册中找到更多信息


42
只是厚脸皮,方法名称的魔术常数是:__METHOD__
Anthony

37
比赛晚了,但令我惊讶的是,__METHOD__实际上返回的结果Class::method如此__FUNCTION__具体地仅返回方法名称...对于仍然不像我这样的RTFM的其他人。
和弦,

26

虽然您可以使用魔术常数,但 __METHOD__我强烈建议您检查一下PHP的反射。PHP5支持此功能。

$modelReflector = new ReflectionClass(__CLASS__);
$method = $modelReflector->getMethod(__METHOD__);

然后,您可以进行检查签名等工作。


当您说“检查签名”时,您的意思是?php.net/manual/en/function.openssl-verify.php
Hector Ordonez

@MrMe No,像这样的方法签名(不要与身份验证签名混淆):en.wikipedia.org/wiki/Type_signature
thesmart 2013年

哦,好吧,基本上是类型提示stackoverflow.com/questions/2161040 / ...谢谢!
Hector Ordonez 2013年

12

正如smartj建议的那样,您可以尝试使用magic常量__METHOD__,但是请记住,这将返回一个字符串,其中还包含您的类名,即'MyClass :: something'。使用__FUNCTION__代替将返回“某物”。


3

使用__FUNCTION__方法可以代替:

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

这在几种方面都存在缺陷,即添加变量和内存以将方法名称存储为字符串并复制已存在的内容,从而不必要地增加了使用的资源(如果您对具有许多方法的大型库执行此操作,则非常重要)。

保证PHP中的魔术常数不会更改,而如果更改​​了方法名,则此方法将需要进行适当的编辑,从而引入了潜在的不一致(请注意,我确实有可能说过,这意味着如果魔术有效,则这是不必要的编辑常量代替)。

费时费力地命名变量,将方法名称重新输入为分配给该不必要变量的字符串,并且当然正确引用了变量名称,这是PHP提供魔术常数的动机(并且反驳了任何主张__FUNCTION__是不必要)。


1

有点笨拙,但您也可以从debug_backtrace()返回值中挖掘出来。


如果您有一个通用的日志记录功能,该功能需要调用它的函数的名称,那么这可能是解决方法。
user9645

1

随着__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'
    ]);
}

而且,如果要更改它,则不必关心在方法内部替换该方法的名称。


1

也许以这种方式缺少后期绑定。

当B类扩展到A类时:

__METHOD__始终返回引用A(A::methodName)的“ className ::”部分

解决方法是:

static::class."::".__FUNCTION__

这样,您可以获得对当前工作类别(B::methodName)的类别引用


-6

你为什么不能这样做?

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

8
__FUNCTION__可用时完全不需要。
太多的php

1
足够公平-但本着同样的精神,我可以满足地认为'__FUNCTION__是不必要的:)
Andrew Hare

6
如果该方法使用新名称会很危险,那么开发人员可能会忘记更新var内容
Marcio Mazzucato 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.