Как получить имя функции внутри функции в 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.


6
FUNCTION работает и для неклассовых функций. Пробовал на PHP 7.0.8.
mvsagar

Точно так же, как получить имя класса?
Киран Редди

2
@KiranReddy Для этого тоже есть волшебная константа __CLASS__. Или вы можете сделать get_class($this).
Шон Боб

1
Пробовал на PHP> = 4
Наби КАЗ

98

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.