Debug vanilla

Submitted by Frederic Marand on Fri, 2009-12-11 12:14

Most of the time, when working on some piece of code, I'll resort to the configured debugger in my current Zend Studio configuration. And you probably do too :-)

However, I often have to access debug-type information on live sites where installing a debugger is out of the question, and I find myself often resorting to parameter dumps like the following:
<?php
// lazy version for simple cases
function foo_bar($x, $y, $z) {
dsm(func_get_args());
// [...]

// less lazy version for more hairy cases
function foo_baz($x, $y, $z) {
dsm(array('in foo_baz, x' => $x, 'y' => $y, 'z' => $z));
// ...
?>

You've probably being using it too and, of course, after the first few dozen times, it becomes a bit used. So here's a tiny snippet that makes such dumps simpler to type and use :

<?php
function foo_quux($x, $y, $z) {
dsm(func_get_args_hash());
// [...]

/**
* Provide a better func_get_args()
*
* @return array
* Hash of parameters, keyed by parameter name
*/
function func_get_args_hash() {
$stack = debug_backtrace();
$stack = $stack[1];
$rf = new ReflectionFunction($stack['function']);
$params = $rf->getParameters();
$ret = array();
foreach ($params as $index => $param) {
$ret[$param->name] = $stack['args'][$index];
}
return $ret;
}
?>

When using dsm(func_get_args_hash()) instead of dsm(func_get_args()), you get:

  1. the names of the parameters along with their values, which you don't get with a normal dsm(func_get_args()).
  2. the values taken by default parameters (those not passed in by the caller, which you don't get from func_get_args

When you're bug-hunting, it's often useful (to me at least) to know which parameter is being represented by a value in the args dump, and which values all the parameters have, default or explicit.

Sample use on _locale_import_one_string_db() below.

Difference between func_get_args() and func_get_args_hash()