Het programmeren in PHP is vaak al moeilijk genoeg en wat informatie over waar je mee bezig bent is altijd wel fijn. Daarom doen veel programmeurs een hoop echo’s tussendoor om wat informatie over de variabelen te krijgen. Helaas een niet ontzettend mooie manier, je code wordt al snel onoverzichtelijk en je moet de echo’s weer allemaal gaan weghalen, die je later misschien weer nodig hebt.
Daarom heb ik een simpele class geschreven om het debuggen net iets makkelijker te maken (download). Deze class bevat een aantal simpele functies die het debuggen wat makkelijker en ook mooier maken. Niets van de debug-informatie wordt ge-output voordat je de functie display() aanroept. Alle debug-informatie kun je dus fijn laten staan.
Genoeg gepraat, laten we eens kijken hoe het werkt:
<?php
require_once('../class.debug.php'); // Include bestand
$d = new Debugger(); // Maak een nieuwe debugger instance
$d->write('Debug test'); // Schrijf een nieuwe debug-regel
$d->display(); // Echo alles
?>
Deze code zal, natuurlijk, de class includen en de regel ‘Debug test’ weergeven, door de functie display. Ik hoop deze code nog wel een beetje duidelijk is, zo moeilijk zal het niet zijn. Al de output zal trouwens in ‘<div id=”debug”>’ komen te staan, zodat je deze makkelijk kan stylen of verbergen.
Natuurlijk is deze simpele debug-regeltjes schrijven niet het enige wat je met de debugger kan:
<?php
require_once('../class.debug.php');
$d = new Debugger();
$d->var_dump(array('a', 'b'), 'testArray'); // Doe een var dump
$d->benchmark('before'); // Benchmark
sleep(3); // Doe hier 'iets'
$d->benchmark('after'); // Nog een benchmark
$d->benchmarks_result('before', 'after'); // Vergelijk resultaten
$d->display();
?>
Nog een stukje code voor jullie. Weer niet zo heel erg moeilijk. Wat we als eerste doen is een var dump. Deze gebruikt de standaard var_dump functie van PHP, maar zet deze tussen de andere debug regels. Het eerste argument is de variabel die je wil dumpen, het mag van elk type zijn, dus niet alleen arrays. De tweede is een naam die je mag opgeven (dus optioneel), zo kan je je dump makkelijk herkennen.
Daarna gaan we wat performance testen, wat hier ontzettend simpel werkt. Je benchmarked eerst een punt, doet iets en daarna nog een punt. Met de functie benchmarks_result() kan je daarna te tijd krijgen die er tussen 2 benchmarks zit. Eigenlijk heel simpel, toch?
Er zijn nog een aantal laatste dingen. Zo kan je bijvoorbeeld alle debug data loggen in een bestand of zelfs gebruik maken van een error handler:
<?php
require_once('../class.debug.php');
$d = new Debugger('debuglog.txt'); // Deze keer met een anders bestand als debug log (optioneel)
set_error_handler(array($d, 'error')); // Eigen error handler gebruiken
$d->log = true; // Loggen aanzetten
$d->display();
?>
Het log bestand komt standaard in debug.log, maar je kan dus je eigen bestand meegeven als eerste argument bij het nieuwe object, daarna moet je het wel nog aanzetten. De error handler is nog ontzettend beperkt, zo kan je bijvoorbeeld niet zien of het een notice warning of andere error is. Ik raad je ook aan om, via het tweede argument, het aantal errors waarbij de debug error handler te beperken naar alleen notices en warnings. Wat er gebeurd bij een fatal error heb ik niet getest, maar ik ben bang dat je niet meer dan een wit scherm krijgt.
Ik hoop dat ik genoeg uitleg heb gegeven over hoe de debugger werkt, het helpt je weliswaar niet met ontzettend veel informatie te geven, maar als je zelf een plek hebt om je informatie kwijt te kunnen kan al ontzettend fijn zijn, geloof me!
Einde van het jaar is vooruitkijken:
Total Voters: 7
5 reacties for "Simpel debuggen met PHP"
werkt makkelijk en goed zo te zien ;)
Het is misschien verstandig wanneer je je script helemaal ‘af’ hebt om toch alle code voor debuggen weer te verwijderen.
Dit zorgt ervoor dat je geen overbodige code runt in je script wat weer voor performance verbeteringen zorgt.
het zou trouwens ook wel mooi zijn als je bij de functie display een eventuele parameter mee kan geven (dmv referentie) en als die dus als referentie naar een variabele is gegeven, dat de variabele dan gevult wordt met debuginfo ipv dat het direct wordt geechod..
@Jan Jaap: Dat is inderdaad altijd het beste, daar heb je gelijk in. Daar heb ik verder niets over te zeggen.
@Libia: Inderdaad, ook een mooie feature, misschien dat ik dat nog eens toevoeg.
zou je niet gewoon de zend editor gebruiken? Die kan volledig debuggen, én heeft net als eclipse gegevens over classen en functies zodat je de manual van php.net niet meer nodig hebt ;)
Derk
Leuk! Plaats een bericht: