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