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