PHPの関数内で関数名を取得するにはどうすればよいですか?


235

出来ますか?

function test()
{
  echo "function name is test";
}

1
好奇心から、これが必要になるのはいつですか?名前がわからない関数を作成することはできますか?
— DisgruntledGoat

37
考えられる用途の1つは、実行のロギングです。「エラーが発生しました」と書いている場合。ログファイルまたは何かにFUNCTION。このように、関数名が変更された場合、ログメッセージを変更することを覚えている人を心配する必要はありません。
— ブライアンラムゼイ

1
ロギングにこれが必要でした!:)
— SublymeRick作成

2
(別の用途で)関数内で関数名を使用する場合にも役立ちます。関数などに基づいてリンクを構築したいfunction name1()場合(例:内部でname1を再度使用する)は、多数の関数に同じテンプレートを使用している場合、時間を大幅に節約できます。
— マフィア

1
@DisgruntledGoat:関数を手動で作成し、すべての関数のエラーメッセージを編集したくない場合に便利です。エラーメッセージに追加すると、作業が減ります。
— John Boe 2016年

回答:


390

正確な方法は、定義済みのマジック定数を使用する__FUNCTION__ ことですです。

例:

class Test {
    function MethodA(){
        echo __FUNCTION__;
    }
}

結果:MethodA。


6
FUNCTIONは、非クラス関数でも機能します。PHP 7.0.8で試してみました。
— mvsagar 2017

同じように、クラス名を取得するにはどうすればよいですか?
— キランレディ2018

2
@KiranReddyそのための魔法の定数もあります: __CLASS__。またはあなたがすることができますget_class($this)。
— Sean the Bean、

1
PHP> = 4で試した
— Nabi KAZ 2018

98

メソッドか関数かに応じて、マジック定数 __METHOD__(クラス名を含む)または__FUNCTION__(関数名のみ)を使用できます... =)


42
METHODにはクラス名が含まれ、FUNCTIONはそれだけです。後者は、クラスのメソッドでも同様に利用できます。
— アリスターブルマン

3
それは本当だ。しかし、methodNameではなくMyClass :: methodNameを取得すると便利な場合があります。
— PatrikAkerstrand 2009年

16

PHP 5を使用している場合、これを試すことができます。

function a() {
    $trace = debug_backtrace();
    echo $trace[0]["function"];
}

14
これは非常に多くのリソースを消費します。FUNCTIONまたはMETHODを使用する方がはるかに効率的です。debug_backtrace()は、関数名だけでなく、他にも必要な場合に最適です。
— Luke Cousins 2013年

2
この目的でdebug_backtrace()を使用することは悪い習慣です
— Marcio Mazzucato 14

1
これが私が見つけた唯一の正しい方法です !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! なぜなら、__FUNCTION__親関数名を返すからです(現在の関数が親関数に含まれている場合)
— T.Todua '25

5
@tazo todua。例を挙げていただけますか?
— 2016

2
<?php

  class Test {
     function MethodA(){
         echo __FUNCTION__ ;
     }
 }
 $test = new Test;
 echo $test->MethodA();
?>

結果:「MethodA」;


このコードスニペットが解決策となる場合もありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
— SilverNak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.