web-dev-qa-db-ja.com

PHPのメソッド内からメソッド名を取得できますか?

このようなことをすることは可能ですか?

_public function something() {
    $thisMethodName = method_get_name(); 
}
_

method_get_name()はメソッドの名前を返しますか?

63
alex

確かに、魔法の定数が必要です。

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

PHPマニュアル から詳細をご覧ください。

102
Kevin Vaughan

魔法の定数__METHOD__ PHPの reflection をチェックすることを強くお勧めします。これはPHP5でサポートされています。

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

次に、署名の検査などのキックを行うことができます。

22
thesmart

Smartjが示唆したように、マジック定数__METHOD__を試すことができますが、これはクラス名も含む文字列、つまり 'MyClass :: something'を返すことに注意してください。代わりに__FUNCTION__を使用すると、「何か」が返されます。

11
Jan Molak

代わりに___FUNCTION___を使用する方法です。

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

これにはいくつかの方法で欠陥があり、変数とメモリを追加してメソッド名を文字列として保存し、既存のものを複製するため、使用されるリソースを不必要に追加します(これを多くのメソッドを持つ大きなライブラリで行う場合、それは非常に重要です)。

PHPのマジック定数は変更されないことが保証されていますが、このアプローチでは、メソッド名が変更された場合、適切な編集が必要になるため、矛盾の可能性が生じます(注意、単にマジック定数が代わりに使用された場合は、それ以外の場合は不要な編集です)。

変数に名前を付け、その不要な変数に割り当てられた文字列としてメソッド名を再入力し、もちろん変数名を適切に参照する時間と労力、これはPHPマジック定数を提供するはじめに(および___FUNCTION___のクレームに反論する必要はありません)。

2

ハックしますが、おそらくdebug_backtrace()戻り値からそれを掘り下げることもできます。

1
timdev

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

そして、私がそれを変更したい場合、メソッド内のメソッドの名前を置き換えることを気にしません。

おそらくこの方法で遅延バインディングが欠落している可能性があります。

クラスBがクラスAを拡張する場合:

__METHOD__は常にAを参照する「className ::」部分を返します(A::methodName

解決策は次のとおりです。

static::class."::".__FUNCTION__

このようにして、現在の作業クラス(B::methodName

0
sdotbertoli