Wie erhalte ich den Funktionsnamen in einer Funktion in PHP?

235

Ist es möglich?

function test()
{
  echo "function name is test";
}
Oh mein Gott
quelle
1
Nur aus Neugier, wann besteht Bedarf daran? Ist es möglich, Funktionen zu erstellen, deren Namen Sie nicht kennen?
DisgruntledGoat
37
Eine mögliche Verwendung wäre die Protokollierung Ihrer Ausführung. Wenn Sie schreiben "Ich hatte einen Fehler in". FUNKTION zu einer Protokolldatei oder so. Auf diese Weise müssen Sie sich bei einer Änderung des Funktionsnamens keine Sorgen machen, dass die Person daran denkt, die Protokollnachricht zu ändern.
Brian Ramsay
1
Benötigt dies für die Protokollierung! Danke, dass
du
2
Auch nützlich, wenn Sie den Funktionsnamen innerhalb der Funktion verwenden möchten (für eine andere Verwendung). Das Erstellen von Links basierend auf der Funktion usw. (z. B. function name1()verwenden Sie name1 erneut im Inneren) würde viel Zeit sparen, wenn Sie dieselbe Vorlage für viele Funktionen haben.
Mafia
1
@DisgruntledGoat: Es ist nützlich, wenn Sie Funktionen manuell erstellen und nicht für jede Funktion eine Fehlermeldung bearbeiten möchten. Wenn Sie es zur Fehlermeldung hinzufügen, haben Sie weniger Arbeit.
John Boe

Antworten:

390

Der genaue Weg ist die Verwendung der __FUNCTION__ vordefinierten magischen Konstante .

Beispiel:

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

Ergebnis : MethodA.

Silfverstrom
quelle
6
FUNCTION funktioniert auch für Funktionen außerhalb der Klasse. Versucht auf PHP 7.0.8.
mvsagar
Wie bekomme ich den Klassennamen?
Kiran Reddy
2
@KiranReddy Auch dafür gibt es eine magische Konstante : __CLASS__. Oder du kannst es tun get_class($this).
Sean the Bean
1
Versucht auf PHP> = 4
Nabi KAZ
98

Sie können die magischen Konstanten __METHOD__ (einschließlich des Klassennamens) oder __FUNCTION__(nur den Funktionsnamen) verwenden, je nachdem, ob es sich um eine Methode oder eine Funktion handelt ... =)

PatrikAkerstrand
quelle
42
METHODE enthält den Klassennamen, FUNCTION ist genau das. Letzteres ist auch in der Methode einer Klasse verfügbar.
Alister Bulman
3
Das ist richtig. Es ist jedoch oft nützlich, MyClass :: methodName anstelle von methodName abzurufen.
PatrikAkerstrand
16

Wenn Sie PHP 5 verwenden, können Sie Folgendes versuchen:

function a() {
    $trace = debug_backtrace();
    echo $trace[0]["function"];
}
Kevin Newman
quelle
14
Das ist unglaublich ressourcenintensiv. Die Verwendung von FUNCTION oder METHOD ist wesentlich effizienter. debug_backtrace () ist großartig, wenn Sie mehr als nur den Funktionsnamen benötigen.
Luke Cousins
2
Es ist eine schlechte Praxis, debug_backtrace () für diesen Zweck zu verwenden
Marcio Mazzucato
1
DIES IST DER einzig richtige Weg habe ich gefunden !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! weil __FUNCTION__gibt den Namen der übergeordneten Funktion zurück (wenn die aktuelle Funktion in der übergeordneten Funktion enthalten ist)
T.Todua
5
@tazo todua. Kannst du ein Beispiel geben?
Alds
2
<?php

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

Ergebnis: "MethodA";

Snehal K.
quelle
Während dieses Code-Snippet die Lösung sein kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
SilverNak