Статьи

Whodunnit

Вам когда-нибудь нужно было знать, кто вызывал эту функцию или метод класса, в результате чего ваше приложение работало ужасно неправильно? Попробуйте 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 +, чтобы использовать его, кстати.