Есть ли функция PHP, чтобы узнать имя функции вызывающего абонента в данной функции?
Получить имя вызывающей функции в PHP?
Ответ 1
См. debug_backtrace - это может проследить ваш стек вызовов до конца.
Вот как вы получите своего звонящего:
$trace = debug_backtrace();
$caller = $trace[1];
echo "Called by {$caller['function']}";
if (isset($caller['class']))
echo " in {$caller['class']}";
Ответ 2
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
Ответ 3
debug_backtrace()
содержит сведения о параметрах, вызовах функций/методов в текущем стеке вызовов.
Ответ 4
Это очень поздно, но я хотел бы поделиться функцией, которая даст имя функции, из которой вызывается текущая функция.
public function getCallingFunctionName($completeTrace=false)
{
$trace=debug_backtrace();
if($completeTrace)
{
$str = '';
foreach($trace as $caller)
{
$str .= " -- Called by {$caller['function']}";
if (isset($caller['class']))
$str .= " From Class {$caller['class']}";
}
}
else
{
$caller=$trace[2];
$str = "Called by {$caller['function']}";
if (isset($caller['class']))
$str .= " From Class {$caller['class']}";
}
return $str;
}
Надеюсь, это будет полезно.
Ответ 5
echo debug_backtrace()[1]['function'];
Работает с PHP 5.4.
Или оптимизирован (например, для случаев не отладки):
echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
Первый аргумент препятствует заполнению неиспользуемых аргументов функции, второй ограничивает трассировку двумя уровнями (нам нужен второй).
Ответ 6
Сделал это и использовал это сам
/**
* 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;
}
}
Ответ 7
Я просто хотел сказать, что способ flori не будет работать как функция, потому что он всегда будет возвращать имя вызываемой функции вместо вызывающего, но у меня нет репутации для комментирования. Я сделал очень простую функцию, основанную на ответе 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..
}
Ответ 8
Вы можете извлечь эту информацию из массива, возвращенного debug_backtrace
Ответ 9
Я сделал небольшое расширение для Zend_Log, теперь он показывает класс/метод/строку, из которой был вызван журнал. См. Здесь http://mikebevz.com/2010/08/logger-with-caller-class-based-on-zend_log/
Ответ 10
Это работало лучше всего для меня: var_dump(debug_backtrace());
Ответ 11
На самом деле я думаю, что debug_print_backtrace() делает то, что вам нужно. http://php.net/manual/en/function.debug-print-backtrace.php
Ответ 12
Это должно работать:
$caller = next(debug_backtrace())['function'];