Мне известно о функции debug_backtrace
, но я ищу некоторые готовые к использованию функции, такие как GetCallingMethodName()
? Было бы прекрасно, если бы он также дал класс методов (если это действительно метод).
Как получить имя вызывающей функции/метода в PHP?
Ответ 1
Функция debug_backtrace()
- это единственный способ узнать это, если вы ленитесь, это еще одна причина, по которой вы должны закодировать GetCallingMethodName()
самостоятельно. Борьба с лень!: D
Ответ 2
Самый простой способ:
echo debug_backtrace()[1]['function'];
Ответ 3
Как и в php 5.4, вы можете использовать
$dbt=debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,2);
$caller = isset($dbt[1]['function']) ? $dbt[1]['function'] : null;
Это не потеряет память, поскольку игнорирует аргументы и возвращает только последние 2 записи стека backtrace и не будет генерировать уведомления в качестве других ответов здесь.
Ответ 4
Вы также можете использовать информацию, предоставленную с помощью исключения php, это элегантное решение:
function GetCallingMethodName(){ $e = new Exception(); $trace = $e->getTrace(); //position 0 would be the line that called this function so we ignore it $last_call = $trace[1]; print_r($last_call); } function firstCall($a, $b){ theCall($a, $b); } function theCall($a, $b){ GetCallingMethodName(); } firstCall('lucia', 'php');
И вы получите это... (voilà!)
Array ( [file] => /home/lufigueroa/Desktop/test.php [line] => 12 [function] => theCall [args] => Array ( [0] => lucia [1] => php ) )
Ответ 5
Мой любимый способ, в одной строке!
debug_backtrace()[1]['function'];
Вы можете использовать его следующим образом:
echo 'The calling function: ' . debug_backtrace()[1]['function'];
Обратите внимание, что это только совместимо с версиями PHP, выпущенными в течение прошлого года. Но это хорошая идея, чтобы поддерживать ваш PHP в любом случае по соображениям безопасности.
Ответ 6
Для меня 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}"
Ответ 7
Я только что написал версию этого "get_caller", надеюсь, это поможет. Моя очень ленивая. Вы можете просто запустить get_caller() из функции, вам не нужно указывать ее так:
get_caller(__FUNCTION__);
Здесь script в полном объеме с причудливым тестовым случаем:
<?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 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.
Ответ 8
Мне нужно было что-то, чтобы просто перечислить вызывающие классы/методы (работая над проектом Magento).
В то время как debug_backtrace
предоставляет тонны полезной информации, объем информации, которую он израсходовал для установки Magento, был ошеломляющим (более 82 000 строк!). Поскольку меня интересовали только функции вызова и класс, я работал над этим небольшое решение:
$callers = debug_backtrace();
foreach( $callers as $call ) {
echo "<br>" . $call['class'] . '->' . $call['function'];
}
Ответ 9
Самый простой способ получить имя родительской функции:
$caller = next(debug_backtrace())['function'];
Ответ 10
Лучший ответ на этот вопрос, который я видел, - это:
list(, $caller) = debug_backtrace(false);
Короткие и чистые