Intereting Posts
PHP не вставляет содержимое в базу данных mySQL: текст, изображения, что угодно Laravel Chumper Datatable Получение данных в один файл данных из нескольких таблиц MySQL Объект массива слияния PHP Проверка формата даты в php Как я могу использовать класс APP CakePHP для загрузки XML-файлов из URL-адреса? Поле ввода типа и запрос, переданный PHP с AJAX Какой обмен сообщениями об ошибках я могу вставить в этот скрипт, чтобы выяснить проблему SimpleXML получает содержимое элемента на основе значения атрибута SELECT * из таблицы SQL с помощью подготовленного оператора Как я могу интегрировать фотоальбом Facebook на веб-сайт? Как разобрать текст с ключом по столбцу с возможными многострочными строками Загрузка файла CodeIgniter – как сохранить имя файла и путь? Как динамически создавать субдомены Как показать индикатор выполнения при загрузке, используя ajax PHP: удаленный размер файла без загрузки файла

Как получить имя вызывающей функции / метода в PHP?

Мне известно о функции debug_backtrace , но я ищу некоторые готовые к использованию функции, такие как GetCallingMethodName() ? Было бы прекрасно, если бы он дал класс метода (если это действительно метод).

Функция debug_backtrace() – это единственный способ узнать это, если вы ленивы, это еще одна причина, по которой вы должны закодировать GetCallingMethodName() . Борьба с лени! : D

Самый простой способ:

 echo debug_backtrace()[1]['function']; 

Вы также можете использовать информацию, предоставленную с помощью исключения php, это элегантное решение:


 function GetCallingMethodName () {
     $ e = новое исключение ();
     $ trace = $ e-> getTrace ();
     // position 0 будет линией, вызывающей эту функцию, поэтому мы ее игнорируем
     $ last_call = $ trace [1];
     print_r ($ last_call);
 }

 функция firstCall ($ a, $ b) {
     theCall ($ a, $ b);
 }

 функция theCall ($ a, $ b) {
     GetCallingMethodName ();
 }

 firstCall ('lucia', 'php');

И вы получите это … (вуаля!)

 массив
 (
     [файл] => /home/lufigueroa/Desktop/test.php
     [line] => 12
     [function] => theCall
     [args] => Массив
         (
             [0] => lucia
             [1] => php
         )

 )

Начиная с php 5.4 вы можете использовать

  $dbt=debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,2); $caller = isset($dbt[1]['function']) ? $dbt[1]['function'] : null; 

Это не испортит память, поскольку игнорирует аргументы и возвращает только последние 2 записи стека backtrace и не будет генерировать уведомления в качестве других ответов здесь.

Мой любимый способ, в одной строке!

 debug_backtrace()[1]['function']; 

Вы можете использовать его следующим образом:

 echo 'The calling function: ' . debug_backtrace()[1]['function']; 

Обратите внимание, что это только совместимо с версиями PHP, выпущенными в течение прошлого года. Но это хорошая идея, чтобы поддерживать PHP в любом случае по соображениям безопасности.

Для меня debug_backtrace ударил мой лимит памяти, и я хотел использовать это в производстве для регистрации и отправки сообщений по электронной почте, поскольку они происходят.

Вместо этого я нашел это решение, которое работает блестяще!

 // Make a new exception at the point you want to trace, and trace it! $e = new Exception; var_dump($e->getTraceAsString()); // Outputs the following #2 /usr/share/php/PHPUnit/Framework/TestCase.php(626): SeriesHelperTest->setUp() #3 /usr/share/php/PHPUnit/Framework/TestResult.php(666): PHPUnit_Framework_TestCase->runBare() #4 /usr/share/php/PHPUnit/Framework/TestCase.php(576): PHPUnit_Framework_TestResult->run(Object(SeriesHelperTest)) #5 /usr/share/php/PHPUnit/Framework/TestSuite.php(757): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult)) #6 /usr/share/php/PHPUnit/Framework/TestSuite.php(733): PHPUnit_Framework_TestSuite->runTest(Object(SeriesHelperTest), Object(PHPUnit_Framework_TestResult)) #7 /usr/share/php/PHPUnit/TextUI/TestRunner.php(305): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false) #8 /usr/share/php/PHPUnit/TextUI/Command.php(188): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array) #9 /usr/share/php/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true) #10 /usr/bin/phpunit(53): PHPUnit_TextUI_Command::main() #11 {main}" 

Я просто написал версию этого «get_caller», надеюсь, это поможет. Моя очень ленивая. Вы можете просто запустить get_caller () из функции, вам не нужно указывать ее так:

 get_caller(__FUNCTION__); 

Вот сценарий в полном объеме с причудливым тестовым примером:

 <?php /* This function will return the name string of the function that called $function. To return the caller of your function, either call get_caller(), or get_caller(__FUNCTION__). */ function get_caller($function = NULL, $use_stack = NULL) { if ( is_array($use_stack) ) { // If a function stack has been provided, used that. $stack = $use_stack; } else { // Otherwise create a fresh one. $stack = debug_backtrace(); echo "\nPrintout of Function Stack: \n\n"; print_r($stack); echo "\n"; } if ($function == NULL) { // We need $function to be a function name to retrieve its caller. If it is omitted, then // we need to first find what function called get_caller(), and substitute that as the // default $function. Remember that invoking get_caller() recursively will add another // instance of it to the function stack, so tell get_caller() to use the current stack. $function = get_caller(__FUNCTION__, $stack); } if ( is_string($function) && $function != "" ) { // If we are given a function name as a string, go through the function stack and find // it's caller. for ($i = 0; $i < count($stack); $i++) { $curr_function = $stack[$i]; // Make sure that a caller exists, a function being called within the main script // won't have a caller. if ( $curr_function["function"] == $function && ($i + 1) < count($stack) ) { return $stack[$i + 1]["function"]; } } } // At this stage, no caller has been found, bummer. return ""; } // TEST CASE function woman() { $caller = get_caller(); // No need for get_caller(__FUNCTION__) here if ($caller != "") { echo $caller , "() called " , __FUNCTION__ , "(). No surprises there.\n"; } else { echo "no-one called ", __FUNCTION__, "()\n"; } } function man() { // Call the woman. woman(); } // Don't keep him waiting man(); // Try this to see what happens when there is no caller (function called from main script) //woman(); ?> 

man () вызывает женщину (), которая вызывает get_caller (). get_caller () не знает, кто его назвал, потому что женщина () была осторожна и не рассказывала об этом, поэтому она рекурсивно выясняет. Затем возвращается тот, кто вызвал женщину (). И распечатка в режиме исходного кода в браузере показывает стек функций:

 Printout of Function Stack: Array ( [0] => Array ( [file] => /Users/Aram/Development/Web/php/examples/get_caller.php [line] => 46 [function] => get_caller [args] => Array ( ) ) [1] => Array ( [file] => /Users/Aram/Development/Web/php/examples/get_caller.php [line] => 56 [function] => woman [args] => Array ( ) ) [2] => Array ( [file] => /Users/Aram/Development/Web/php/examples/get_caller.php [line] => 60 [function] => man [args] => Array ( ) ) ) man() called woman(). No surprises there. 

Мне нужно было что-то, чтобы просто перечислить вызывающие классы / методы (работая над проектом Magento).

В то время как debug_backtrace предоставляет debug_backtrace полезной информации, объем информации, которую он искал для установки Magento, был подавляющим (более 82 000 строк!) Поскольку меня беспокоила только вызывающая функция и класс, я работал над этим небольшим решением:

 $callers=debug_backtrace(); foreach($callers as $call) { echo "<br>" . $call['class'] . '->' . $call['function']; } 

Самый простой способ получить имя родительской функции:

 $caller = next(debug_backtrace())['function']; 

Лучший ответ на этот вопрос, который я видел, – это:

 list(, $caller) = debug_backtrace(false); 

Короткие и чистые