Как получить имя функции внутри функции в PHP?

235

Является ли это возможным?

function test()
{
  echo "function name is test";
}
О, мой бог
источник
1
Просто из любопытства, когда в этом есть необходимость? Можно ли создавать функции, имя которых вы не знаете?
Рассерженная шлюха
37
Одним из возможных применений будет регистрация вашего исполнения. Если вы пишете «У меня была ошибка в». ФУНКЦИЯ к лог-файлу или что-то. Таким образом, если имя функции изменено, вам не нужно беспокоиться о человеке, который помнит об изменении сообщения журнала.
Брайан Рамсей
1
Это необходимо для регистрации! спасибо за вопрос :)
SublymeRick
2
Также полезно, если вы хотите использовать имя функции внутри функции (для другого использования). Подобно созданию ссылок на основе функции и т. Д. (Например, function name1()затем снова использовать name1 внутри), сэкономит много времени, если у вас будет один и тот же шаблон для множества функций.
Мафия
1
@DisgruntledGoat: полезно, если вы создаете функции вручную и не хотите редактировать сообщение об ошибке для каждой функции. Добавление его в сообщение об ошибке означает, что у вас меньше работы.
Джон Бо

Ответы:

390

Точный способ - использовать __FUNCTION__ предопределенную магическую константу .

Пример:

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

Результат: MethodA.

Silfverstrom
источник
6
FUNCTION работает и для неклассовых функций. Пробовал на PHP 7.0.8.
mvsagar
Точно так же, как получить имя класса?
Киран Редди
2
@KiranReddy Для этого тоже есть волшебная константа __CLASS__. Или вы можете сделать get_class($this).
Шон Боб
1
Пробовал на PHP> = 4
Наби КАЗ
98

Вы можете использовать магические константы __METHOD__ (включая имя класса) или __FUNCTION__(просто имя функции) в зависимости от того, является ли это методом или функцией ... =)

PatrikAkerstrand
источник
42
METHOD включает в себя имя класса, FUNCTION это просто так. Последнее одинаково доступно в методе класса.
Алистер Булман
3
Это правда. Но часто бывает полезно получить MyClass :: methodName вместо methodName.
PatrikAkerstrand
16

Если вы используете PHP 5, вы можете попробовать это:

function a() {
    $trace = debug_backtrace();
    echo $trace[0]["function"];
}
Кевин Ньюман
источник
14
Это невероятно ресурсоемкий. Использование FUNCTION или METHOD намного эффективнее. debug_backtrace () отлично подходит, если вам нужно больше, чем просто имя функции.
Люк Казинс
2
Это плохая практика - использовать debug_backtrace () для этой цели
Marcio Mazzucato
1
ЭТО ЕДИНСТВЕННЫЙ ПРАВИЛЬНЫЙ ПУТЬ, который я нашел !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! потому что __FUNCTION__возвращает имя родительской функции (когда текущая функция включена в родительскую функцию)
T.Todua
5
@tazo todua. можешь привести пример?
alds
2
<?php

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

Результат: «Метод А»;

Снехал К
источник
Хотя этот фрагмент кода может быть решением, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
SilverNak