Вам когда-нибудь нужно было знать, кто вызывал эту функцию или метод класса, в результате чего ваше приложение работало ужасно неправильно? Попробуйте debug_backtrace () .
Отбросив это в функции, где была обнаружена проблема, вы увидите стек вызовов, который привел к вызову функции.
По сути, стек вызовов — это все текущие активные функции / методы, которые еще не вернулись к точке, в которой они были вызваны. Это проще всего увидеть на примере.
Допустим, у вас есть код, где одна функция вызывает другую, которая вызывает другую, как;
"; }
"; }
function formatName ($ name) {
$ name = strtolower ($ name);
$ name = ucfirst ($ name);
привет ($ название);
}
function displayMessage ($ name) {
FORMATNAME ($ название);
}
?>
Поэтому, если вызывается displayMessage (), он вызывает formatName (), который сам вызывает hello () (ОК, это глупый пример, но он иллюстрирует суть).
Теперь простой контроллер для вышеуказанных функций;
if ( isset($_GET['name']) ) { displayMessage($_GET['name']); } else { ?>
Все идет нормально. Но скажем, через несколько недель вы модифицируете функцию formatName () и по ошибке вставляете ошибку;
function formatName($name) { $name = strtolower($name);
if ($ name == ‘ted’) {
$ name. = ‘(приятно вас видеть)’;
} еще {
$ name = ucfirst ($ name);
}
привет ($ название);
}
Хотя Тед должен был получить дополнительное дружеское сообщение, первая буква его имени больше не переводится в верхний регистр.
Не понимая, что есть проблема, через несколько дней вы получаете злобные звонки от некоторых клиентов о том, что первая буква их имени строчная. Все остальные кажутся совершенно счастливыми, поэтому вы несколько озадачены.
Из-за большой сложности кода найти причину проблемы довольно сложно, поэтому вместо этого вы используете debug_backtrace () в функции hello (), например;
function hello($name) { if ( $name != ucfirst($name) ) { // In reality, log to some log file... echo "
«; print_r (debug_backtrace ()); эхо "
«;
}
echo «Hello $ name
«;
}
Теперь, если первая буква имени не в верхнем регистре, вы увидите стек вызовов. Вот как это выглядит;
Array ( [0] => Array ( [file] => /home/hfuecks/public_html/debug.php [line] => 20 [function] => hello [args] => Array ( [0] => ted (nice to see you) )
)
[1] => Массив
(
[file] => /home/hfuecks/public_html/debug.php
[line] => 24
[function] => formatname
[args] => Массив
(
[0] => Тед
)
)
[2] => Массив
(
[file] => /home/hfuecks/public_html/debug.php
[line] => 28
[function] => displaymessage
[args] => Массив
(
[0] => Тед
)
)
)
Каждый элемент массива первого порядка показывает вызываемую функцию, элемент 0 — это точка, в которой вызывался debug_backtrace (), а под ним — функции, вызываемые до него (т. Е. Сначала вызывается displayMessage (), поэтому он отображается последним). В массивах второго порядка вы увидите имя вызываемой функции, файл и номер строки, в которой определена функция и заданы аргументы.
В приведенной выше трассировке вы можете видеть, что функции formatName () был присвоен строковый аргумент ‘Ted’, но внутри функции hello () она теперь в нижнем регистре. Внезапно вы понимаете, что случилось …
Такие инструменты, как XDebug, предоставляют более мощные средства отладки, но debug_backtrace () может быть полезен в средах, где у вас нет возможности добавлять свои собственные расширения PHP, и может оказаться полезной для добавления в журналы ошибок. Вам нужен PHP 4.3.x +, чтобы использовать его, кстати.