您可以从 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 functions
和Variable 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 中的方法中获取方法名称吗?的主要内容,如果未能解决你的问题,请参考以下文章