你能从PHP中的方法中获取方法名吗?

时间:2009-09-15 02:31:43

标签: php methods oop

是否可以做这样的事情?

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

method_get_name()返回方法名称的位置?

8 个答案:

答案 0 :(得分:98)

当然,你想要魔术常数。

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

the php manual

了解详情

答案 1 :(得分:20)

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

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

然后,您可以执行诸如检查签名之类的内容。

答案 2 :(得分:11)

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

答案 3 :(得分:2)

使用__FUNCTION__代替:

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

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

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

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

答案 4 :(得分:1)

Hackish,但您也可以将其从debug_backtrace()返回值中删除。

答案 5 :(得分:0)

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

如果我想更改方法的名称,也不必担心在方法内部替换方法的名称。

答案 6 :(得分:0)

也许以此方式丢失了后期绑定。

当B类扩展到A类时:

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

解决方案是:

static::class."::".__FUNCTION__

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

答案 7 :(得分:-6)

你为什么不能这样做?

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