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); // unde the_content este numele unei functiei

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.

1 Star2 Stars3 Stars4 Stars5 Stars (7 votes, average: 5 out of 5)
Loading ... Loading …

Popularity: 27%