在PHP中从方法中获取方法名

ffvjumwh  于 2023-10-15  发布在  PHP
关注(0)|答案(8)|浏览(101)

有可能做这样的事情吗?

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

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

k4emjkb1

k4emjkb11#

当然,你想要魔法常数。

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

了解更多关于the php manual

b91juud3

b91juud32#

虽然你可以使用magic constant__METHOD__,但我强烈建议你看看PHP的reflection。这在PHP5中得到了支持。

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

然后你可以做一些很棒的事情,比如检查签名等。

k3bvogb1

k3bvogb13#

正如smartj所建议的,你可以尝试使用魔术常量__METHOD__,但要记住,这将返回一个包含类名的字符串,即。'MyClass::something'。使用__FUNCTION__将返回“something”。

j2datikz

j2datikz4#

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

如果我想改变方法的话,它并不关心替换方法内部的方法名。

suzh9iv8

suzh9iv85#

使用__FUNCTION__是正确的方法,而不是:

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

它在几个方面存在缺陷,添加变量和内存来将方法名存储为字符串,并复制已经存在的内容,因此不必要地增加了使用的资源,(如果您为具有许多方法的大型库这样做,这非常重要)。
PHP中的魔术常量保证不会改变,而如果方法名改变了,这种方法需要进行适当的编辑,从而引入了不一致的可能性(注意,我确实说过潜在的,这意味着如果使用魔术常量,这是不必要的编辑)。
命名一个变量的时间和精力,重新输入方法名作为一个字符串分配给那个不必要的变量,当然正确地引用变量名,这是PHP提供魔术常量的动机开始(反驳任何声明__FUNCTION__是不必要的)。

qlfbtfca

qlfbtfca6#

也许是这样错过了后期绑定。
当B类扩展A类时:
__METHOD__总是返回引用到A(A::methodName)的“className::“部分
解决方案是:
static::class."::".__FUNCTION__
通过这种方式,您可以获得对当前工作类(B::methodName)的类引用。

gcmastyq

gcmastyq7#

这是一个小技巧,但您也可以从debug_backtrace()返回值中找到它。

s6fujrry

s6fujrry8#

为什么你不能这样做?

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

相关问题