Debugging rapid în PHP
Posted on April 19th, 2008 in Developer | No Comments »
Nu o să mă întind, pentru că toată lumea a făcut deja debugging în PHP, dar o să amintesc câteva procedee care mi-au fost de mare folos, în general, în lucrul la proiecte (foarte) mari.
1. assert - Pe parcursul scriptului, în locuri în care crezi că o să crape, chemi funcţia assert dând ca parametru condiţia favorabilă. Scriptul poate fi oprit dacă valoarea de adevăr a condiţia va fi evaluată ca fiind falsă (by default, scriptul nu se opreşte). Este recomandat ca assert să fie prezent doar în timpul dezvoltării. Exemplu:
assert($expectedRows == $foundRows);
Poţi wrap-a această funcţie în myAssert, de exemplu, pentru a specifica şi alte instrucţiuni (logging etc.). Cu funcţia assert_options poţi specifica opţiuni ca:
ASSERT_BAIL- opreşte scriptul la evaluarea falsă a condiţiei;ASSERT_QUIET_EVAL- nu sunt output-ate erori la evaluarea la fals, util dacă vrei să le loghezi pentru o depanare ulterioară;ASSERT_CALLBACK- callback care se cheamă după evaluarea la fals - aici poţi face logging-ul;- şi altele.
2. debug_backtrace - Afişează stiva de call-uri (de funcţii) şi de include-uri care au determinat flow-ul din aplicaţie, până la momentul apelului. Întoarce un vector asociativ cu informaţii de genul: numele funcţiei, linia de cod, numele fişierului etc. şi astfel vă puteţi scrie propria metodă de afişare a acestora. Pentru rapiditate poţi folosi debug_print_backtrace (doar PHP 5), pentru un output standard. Exemplu (generat în codul WordPress-ului):
#0 include() called at [/home/designla/public_html/bogdan/blog/wp-includes/template-loader.php:20]
#1 require_once(/home/designla/public_html/bogdan/blog/wp-includes/template-loader.php) called at [/home/designla/public_html/bogdan/blog/wp-blog-header.php:21]
#2 require(/home/designla/public_html/bogdan/blog/wp-blog-header.php) called at [/home/designla/public_html/bogdan/blog/index.php:4]
Eu, de obicei, am o funcţie globală pentru aplicaţie, care conţine propria mea afişare a backtrace-ului sau care doar wrappează apelul standard de afişare.
function myBacktrace() {
debug_print_backtrace(); // Pot scrie ulterior o afisare proprie
}
3. Folosirea mecanismului de reflection. Reflection este mecanismul prin care un program îşi poate cunoaşte funcţiile, clasele şi instanţele lor, excepţii şi alte entităţi, la runtime. Eu m-am folosit foarte recent de acest mecanism, facând debugging la un proiect foarte mare şi neştiind unde era definită o funcţie pe care o apelam (în plus, existau mai multe funcţii cu acelaşi nume în aplicaţie şi o junglă de includeri până la acel apel). Simplul apel arătat mai jos, mi-a dezvăluit această informaţie. Exemplu (generat în codul WordPress-ului):
ReflectionFunction::export(’the_content
Apelul a produs:
Function [ <user> function the_content ] {
@@ /home/designla/public_html/bogdan/blog/wp-includes/post-template.php 53 - 58
- Parameters [3] {
Parameter #0 [ <optional> $more_link_text = ‘(more…
Parameter #1 [ <optional> $stripteaser = 0 ]
Parameter #2 [ <optional> $more_file = ” ]
}
}
Putem observa:
- declaraţia funcţiei;
- cine o defineşte: în cazul nostru este user defined function -
<user>;strtolower, de exemplu, este<internal:standard>; - parametrii;
- locaţia ei şi liniile de cod între care este cuprinsă definiţia funcţiei.
export este o metoda statică pe care o are fiecare clasă care implementează Reflector pentru entitatea respectivă, dar mai sunt şi o grămadă de metode care furnizează doar informaţiile ce te interesează.
Va urma.
Popularity: 27%


