Debug vanilla

Submitted by Frederic Marand on

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()