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

Posted

技术标签:

【中文标题】您可以从 PHP 中的方法中获取方法名称吗?【英文标题】:Can you get a method name from within a method in PHP? 【发布时间】:2010-11-28 07:58:42 【问题描述】:

有可能做这样的事情吗?

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

method_get_name() 在哪里返回方法的名称?

【问题讨论】:

【参考方案1】:

当然,你想要魔法常数。

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

通过the php manual了解更多信息

【讨论】:

顺便说一句,方法名的神奇常数是:__METHOD__ 游戏迟到了,但我惊讶地发现__METHOD__ 实际上返回Class::method 所以__FUNCTION__ 专门返回方法名称......对于其他任何仍然 RTFM 不喜欢我。【参考方案2】:

虽然您可以使用 magic constant __METHOD__,但我强烈建议您查看 PHP 的 reflection。 PHP5 支持此功能。

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

然后你就可以做一些诸如检查签名之类的事情了。

【讨论】:

当您说“检查签名”时,您是指这个吗? php.net/manual/en/function.openssl-verify.php @MrMe 不,这样的方法签名(不要与身份验证签名混淆):en.wikipedia.org/wiki/Type_signature 哦,好吧,基本上是类型提示***.com/questions/2161040/… 谢谢!【参考方案3】:

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

【讨论】:

【参考方案4】:

使用__FUNCTION__ 是要走的路,而不是:

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

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

保证 PHP 中的魔术常量不会更改,而如果方法名称发生更改,这种方法将需要进行适当的编辑,从而引入不一致的可能性(注意,我确实说过潜在的,这意味着它只是一个不必要的编辑如果改为使用魔法常数)。

命名变量所花费的时间和精力,将方法名称重新键入为分配给该不必要变量的字符串,当然还要正确引用变量名称,这是 PHP 提供魔术常量开头的动机(并反驳任何声明__FUNCTION__ 都是不必要的)。

【讨论】:

【参考方案5】:

__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(); :-) 它的文档在哪里? (我知道这些年来我在某个地方见过它,只是不记得它的确切名称)(一般我知道它是Variable functionsVariable variables 的组合)【参考方案6】:

Hackish,但您也可以从 debug_backtrace() 返回值中挖掘出来。

【讨论】:

如果您有一个通用的日志记录函数需要调用它的函数的名称,这可能是可行的方法。【参考方案7】:

可能以这种方式缺少后期绑定。

当 B 类扩展 A 类时:

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

解决办法是:

static::class."::".__FUNCTION__

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

【讨论】:

【参考方案8】:

你为什么不能这样做?

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

【讨论】:

__FUNCTION__ 可用时完全不需要。 很公平 - 但本着同样的精神,我可以满足于 `__FUNCTION__ 是不必要的:) 如果方法收到新名称很危险,开发人员可能会忘记更新 var 内容

以上是关于您可以从 PHP 中的方法中获取方法名称吗?的主要内容,如果未能解决你的问题,请参考以下文章

您可以从类中获取实例变量名称吗? [复制]

方法可以使用Java中的反射找出自己的名称吗?

Java如何获取方法参数中的名称

我们可以从套接字地址中获取应用程序名称吗?

php有没有啥函数可以获取一个方法中的参数名和参数类型的

Java 的方法可以“知道”它自己的名字吗? [复制]