-
Notifications
You must be signed in to change notification settings - Fork 5
Debugging
Laurynas Veržukauskas edited this page Mar 27, 2014
·
2 revisions
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();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
invokeonly becausevar_dumpandprint_ruses more than one parameter. Thus,var_dumpwould flood output (invoke's 3rd param is entire collection), whileprint_rwould have varying behavior)
- Reference
- Tips and tricks