Немного абстрактного кода:
function test($a = 5) {
debug_backtrace();
a = 10;
}
Что debug_trace расскажет нам об аргументах тестовой функции?
Будет ли это захватить $a
как 5 или 10?
Если мы вызовем функцию из примера следующим образом:
test(4);
он захватит «4».
И если мы назовем это так:
test();
на самом деле он не получит никаких данных об аргументах. Я предполагаю, что парсер не инициализирует аргументы, если они нигде не использовались. (Вызов debug_backtrace не считается.)
Я провел еще несколько исследований, и все оказалось немного неожиданным (лично для меня), если передать аргументы по ссылке … Но, как я понимаю, это вполне логично.
Если мы используем следующий код:
<?php
function test2(&$a) {
$a = 5;
test($a);
$a = 8;
}
function test(&$a) {
$a = 6;
print_r(debug_backtrace());
$a = 7;
}
$test = 1;
test2($test);
Мы получим такой вывод:
Array (
[0] => Array (
[file] => /var/www/localhost/htdocs/index.php
[line] => 4
[function] => test
[args] => Array ( [0] => 6 )
)
[1] => Array (
[file] => /var/www/localhost/htdocs/index.php
[line] => 13
[function] => test2
[args] => Array ( [0] => 6 )
)
)
Таким образом, debug_backtrace () всегда печатает текущее состояние аргументов функции, переданных ссылками (когда фактически вызывался debug_backtrace ()), независимо от того, было ли у них другое значение при вызове родительской функции.
Будьте осторожны при отладке! 🙂
Других решений пока нет …