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


235

Czy to możliwe?

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

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.


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 ... =)


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"];
}

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”;


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.