Jak uzyskać nazwę funkcji wewnątrz funkcji w PHP?

235

Czy to możliwe?

function test()
{
  echo "function name is test";
}
o mój Boże
źródło
1
Z ciekawości, kiedy jest to potrzebne? Czy można tworzyć funkcje, których nazwy nie znasz?
DisgruntledGoat
37
Jednym z możliwych zastosowań byłoby zarejestrowanie wykonania. Jeśli piszesz „Wystąpił błąd w”. FUNKCJA do pliku dziennika lub czegoś takiego. W ten sposób, jeśli nazwa funkcji zostanie zmieniona, nie musisz się martwić, że osoba pamięta o zmianie komunikatu w dzienniku.
Brian Ramsay,
1
Potrzebowałem tego do logowania! dzięki za pytanie :)
SublymeRick
2
Przydatny również, jeśli chcesz użyć nazwy funkcji wewnątrz funkcji (do innego użytku). Podobnie jak w przypadku konstruowania łączy na podstawie funkcji itp. (Np .: function name1()użyj nazwy1 ponownie w środku), zaoszczędziłbyś dużo czasu, jeśli masz ten sam szablon dla wielu funkcji.
Mafia
1
@DisgruntledGoat: przydaje się, jeśli tworzysz funkcje ręcznie i nie chcesz edytować komunikatu o błędzie dla każdej funkcji. Dodanie go do komunikatu o błędzie oznacza, że ​​masz mniej pracy.
John Boe

Odpowiedzi:

390

Dokładnym sposobem jest użycie __FUNCTION__ predefiniowanej stałej magicznej .

Przykład:

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

Rezultat: MethodA.

Silfverstrom
źródło
6
FUNKCJA działa również w przypadku funkcji nieklasowych. Próbowałem na PHP 7.0.8.
mvsagar
W ten sam sposób, jak zdobyć nazwę klasy?
Kiran Reddy,
2
@KiranReddy Jest stałym magia za które też: __CLASS__. Lub możesz to zrobić get_class($this).
Sean the Bean
1
Próbowałem na PHP> = 4
Nabi KAZ
98

Możesz użyć magicznych stałych __METHOD__ (obejmuje nazwę klasy) lub __FUNCTION__(po prostu nazwę funkcji) w zależności od tego, czy jest to metoda, czy funkcja ... =)

PatrikAkerstrand
źródło
42
METODA zawiera nazwę klasy, po prostu FUNKCJA . Ten ostatni jest równie dostępny w metodzie klasy.
Alister Bulman
3
To prawda. Ale często przydatne jest uzyskanie MyClass :: methodName zamiast methodName.
PatrikAkerstrand,
16

Jeśli używasz PHP 5, możesz spróbować:

function a() {
    $trace = debug_backtrace();
    echo $trace[0]["function"];
}
Kevin Newman
źródło
14
Jest to niezwykle wymagające pod względem zasobów. Korzystanie z FUNKCJI lub METODY jest znacznie wydajniejsze. debug_backtrace () jest świetny, jeśli potrzebujesz czegoś więcej niż tylko nazwy funkcji.
Luke Cousins
2
Używanie w tym celu debug_backtrace () jest złą praktyką
Marcio Mazzucato,
1
TO JEDYNY PRAWIDŁOWY SPOSÓB , jaki znalazłem !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! ponieważ __FUNCTION__zwraca nazwę funkcji nadrzędnej (gdy bieżąca funkcja jest zawarta w funkcji nadrzędnej)
T.Todua,
5
@tazo todua. czy możesz podać przykład?
alds
2
<?php

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

Wynik: „MethodA”;

Snehal K.
źródło
Ten fragment kodu może być rozwiązaniem, ale wyjaśnienie naprawdę pomaga poprawić jakość posta. Pamiętaj, że w przyszłości odpowiadasz na pytanie dla czytelników, a ci ludzie mogą nie znać przyczyn Twojej sugestii kodu.
SilverNak,