Skip to content

Debugging

Laurynas Veržukauskas edited this page Mar 27, 2014 · 2 revisions

Unchaining

Consider following code:

$out = Underscore::from([1,2,3,4,5])
    ->map(function($num) { return ['number' => $num];})
    ->filter(function($item) { return ($item['number'] % 2) == 0;})
    ->pick('number')
    ->reduce(function($sum, $num) { $sum += $num; return $sum; }, 1000)
    ->value();

Trying to use debugger will be troublesome. Step into goes into methods, step over executes whole chain. However, if we rewrite following without using chaining (i.e. one call per line), we can step over each call and inspect Underscore->$wrapped variable to see result after transformation:

$u = Underscore::from([1,2,3,4,5])
$u->map(function($num) { return ['number' => $num];})
$u->filter(function($item) { return ($item['number'] % 2) == 0;})
$u->pick('number')
$u->reduce(function($sum, $num) { $sum += $num; return $sum; }, 1000)
$out = $u->value();

invoke()/tap() + debug statement

As alternative you can insert debug call into chain:

$debug = function($value) {
    var_dump($value);
    //print_r($value);
};

$out = Underscore::from([1,2,3,4,5])
    ->map(function($num) { return ['number' => $num];})

    // print each item separately     
    ->invoke($debug)
    // print whole collection
    ->tap($debug)

    ->filter(function($item) { return ($item['number'] % 2) == 0;})
    ->reduce(function($sum, $num) { $sum += $num; return $sum; }, 1000)
    ->value();

Wrapping PHP method into lambda is required for invoke only because var_dump and print_r uses more than one parameter. Thus, var_dump would flood output (invoke's 3rd param is entire collection), while print_r would have varying behavior)

Clone this wiki locally