Php имя выполняемой функции

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

Есть ли функция PHP, чтобы узнать имя функции вызывающей стороны в данной функции?

Вы должны использовать Xdebug. Смотрите мой ответ в этом сообщении: stackoverflow.com/questions/1513069/…

Xdebug — это не просто функция PHP, которая была исходным запросом. Если вы хотите, например, использовать имя функции вызывающей стороны в более поздней логике PHP и не устанавливать XDebug на производственных серверах, вам нужна функция PHP.

Смотрите debug_backtrace — это может отследить ваш стек вызовов до самого верха.

Вот как бы вы получили своего абонента:

$trace = debug_backtrace(); $caller = $trace[1]; echo "Called by "; if (isset($caller['class'])) echo " in "; 

Мне кажется, что это печатает имя функции вызываемого абонента. Используйте list(, $caller) = debug_backtrace(false); для получения звонящего, false для производительности 😉 (php5.3)

Многие решения, встречающиеся в сети, получают второй элемент массива backtrace для вызова вызывающего экземпляра: можем ли мы быть в этом уверены? Всегда ли второй элемент — тот, который мы ищем? Я думал, что __construct (), который включает в себя другой вызов, такой как parent :: __ construct (), может сместить другую позицию реального абонента (еще не пробовал).

Я попытался проверить порядок вызовов, возвращаемых при использовании ReflectionClass, и он, очевидно, меняет позицию «реального» метода вызывающего, который виден в пользовательском интерфейсе, поэтому никакие предположения относительно позиции обратной трассировки не могут быть сделаны.

сдвиг массива удалит первый элемент и вернет удаленный элемент. Исходный массив будет изменен, и это должно дать требуемый результат echo ‘called by ‘.$trace[0][‘function’]

debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1][‘function’]; чтобы получить имя звонящего с лучшей производительностью.

Xdebug предоставляет несколько приятных функций.

php Class MyClass  function __construct() $this->callee(); > function callee()  echo sprintf("callee() called @ %s: %s from %s::%s", xdebug_call_file(), xdebug_call_line(), xdebug_call_class(), xdebug_call_function() ); > > $rollDebug = new MyClass(); ?> 
callee() called @ /var/www/xd.php: 16 from MyClass::__construct

Чтобы установить Xdebug на Ubuntu, лучше всего

sudo aptitude install php5-xdebug

Вам может понадобиться сначала установить php5-dev

sudo aptitude install php5-dev

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

public function getCallingFunctionName($completeTrace=false)  $trace=debug_backtrace(); if($completeTrace)  $str = ''; foreach($trace as $caller)  $str .= " -- Called by "; if (isset($caller['class'])) $str .= " From Class "; > > else  $caller=$trace[2]; $str = "Called by "; if (isset($caller['class'])) $str .= " From Class "; > return $str; > 

Я надеюсь, что это будет полезно.

debug_backtrace() предоставляет сведения о параметрах, вызовах функций / методов в текущем стеке вызовов.

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

Или оптимизирован (например, для случаев не отладки):

echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];

Первый аргумент предотвращает заполнение неиспользуемых аргументов функции, второй ограничивает трассировку двумя уровнями (нам нужен второй).

Сделал это и использую это сам

/** * Gets the caller of the function where this function is called from * @param string what to return? (Leave empty to get all, or specify: "class", "function", "line", "class", etc.) - options see: http://php.net/manual/en/function.debug-backtrace.php */ function getCaller($what = NULL)  $trace = debug_backtrace(); $previousCall = $trace[2]; // 0 is this call, 1 is call in previous function, 2 is caller of that function if(isset($what))  return $previousCall[$what]; > else  return $previousCall; > >

Я просто хотел заявить, что способ flori не будет работать как функция, потому что он всегда будет возвращать имя вызываемой функции вместо вызывающего, но у меня нет репутации комментировать. Я сделал очень простую функцию, основанную на ответе Флори, которая отлично подходит для моего случая:

class basicFunctions public function getCallerFunction() return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['function']; > >

ПРИМЕР:

function a($authorisedFunctionsList = array("b")) $ref = new basicFunctions; $caller = $ref->getCallerFunction(); if(in_array($caller,$authorisedFunctionsList)): echo "Welcome!"; return true; else: echo "Unauthorised caller!"; return false; endif; > function b() $executionContinues = $this->a(); $executionContinues or exit; //Do something else.. >

Вы можете извлечь эту информацию из массива, возвращенного debug_backtrace

Этот работал лучше всего для меня: var_dump(debug_backtrace());

На самом деле я думаю, что debug_print_backtrace () делает то, что вам нужно. http://php.net/manual/en/function.debug-print-backtrace.php

$caller = next(debug_backtrace())['function'];
 // Outputs an easy to read call trace // Credit: https://www.php.net/manual/en/function.debug-backtrace.php#112238 // Gist: https://gist.github.com/UVLabs/692e542d3b53e079d36bc53b4ea20a4b Class MyClass public function generateCallTrace()  $e = new Exception(); $trace = explode("\n", $e->getTraceAsString()); // reverse array to make steps line up chronologically $trace = array_reverse($trace); array_shift($trace); // remove array_pop($trace); // remove call to this method $length = count($trace); $result = array(); for ($i = 0; $i  $length; $i++)  $result[] = ($i + 1) . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering > return "\t" . implode("\n\t", $result); > > // call function where needed to output call trace /** Example output: 1) /var/www/test/test.php(15): SomeClass->__construct() 2) /var/www/test/SomeClass.class.php(36): SomeClass->callSomething() **/```

Источник

Как получить имя вызывающей функции / метода в 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 и не будет генерировать уведомления в качестве других ответов здесь.

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

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

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 " 

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

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

 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 "
" . $call['class'] . '->' . $call['function']; >

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

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

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

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

Источник

Читайте также:  Php header redirect get
Оцените статью