Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

Jak vypsat funkci, argumenty, proměnné?

Ladíte v prohlížeči PHP aplikaci a potřebujete ji v jednom místě snadno zastavit a přehledně zobrazit všechny důležité informace jako:

  • právě volanou funkci
  • argumenty, které ji byly předané
  • lokální proměnné
  • call stack

A občas by se hodily i globální proměnné $_SERVER, $_COOKIES, HTTP hlavičky, apod.

Jak na to?

Tohle umí Laděnka neboli Tracy, dříve Nette\Diagnostics\Debugger. Pokud používáte Nette Framework, Laděnku už máte, protože je jeho nedílnou součástí.

Laděnku nejprve aktivujeme. Pro uživatele samostatné verze stačí zavolat:

ndebug();

(Uživatelé Nette Framework, aktivujte Debugger::$strictMode = TRUE; a zavolejte Debugger::enable().)

Nyní v místě, kde chceme program přerušit a zobrazit všechny požadované informace, stačí napsat $stop():

public function authenticate(array $credentials)
{
    list($username, $password) = $credentials;
    $row = $this->users->where('username', $username)->fetch();
    $stop(); // tady se program přeruší

    ...

Debugger vám přehledně ukáže místo, kde k přerušení došlo:

Všimněte si, že hodnotu lokální proměnné lze zobrazit tím, že na ni najedete myší. Cool!

Můžete si nastavit systém tak, aby při kliknutí na jméno souboru jej otevřel ve vašem oblíbeném editoru:

K dispozici je přehled všech proměnných, které byly funkci předány (pod záložkou Callstack):

A přehledně vypsané všechny lokální proměnné, složitější struktury můžete kliknutím rozbalit:

Samozřejmostí je celý call stack, opět s rozklikávacím pohledem do zdrojového kódu nebo předávaných proměnných. A také lze klikem na jméno souboru jej otevřít v editoru:

Níže najdete všechny informace o HTTP požadavku, počínaje hlavičkami přes cookies k GET/POST proměnným:

A nechybí ani pole $_SERVER, konfigurační direktivy, konstanty atd:

Dokáže tohle váš framework? ;-) Pokud ne, seznamte ho s Laděnkou.

Komentáře

  1. Olda http://salek.info #1

    avatar

    Like, bez laděnky si už PHP ani nepředstavuji, mělo by být součástí přímo PHP :)

    před 5 lety
  2. Chytrak #2

    Ahoj Davide, to se nudíš nebo proč píšeš takové věci, které již jsou dávno napsané. Tohle a mnohem víc ti dovolí php_xdebug (http://xdebug.org/)…
    Myslím, že jsi to právě ty kdo hlásá něco ve smyslu: „proč znovu vymýšlet kolo“. Přijde mi, že se o to neustále snažiš…

    před 5 lety | reagoval [3] David Grudl [7] juzna.cz
  3. David Grudl http://davidgrudl.com #3

    avatar

    #2 Chytraku, ještě jsem na žádném hostingu neviděl XDebug povolený.

    (Laděnka toho umí mnohem víc, než je v článku uvedeno, tohle je vlastně jen jedna její vlastnost).

    před 5 lety
  4. Chytrak #4

    Ty profiluješ na serveru?

    před 5 lety | reagoval [6] David Grudl
  5. Michal Kleiner #5

    avatar

    Chytraku, pro použití Laděnky z Nette se nemusí nikde nic instalovat/nastavovat jako v případě xdebugu.

    před 5 lety
  6. David Grudl http://davidgrudl.com #6

    avatar

    #4 Chytraku, Počkej, tohle se netýká profileru, ale debuggeru. Občas nastane situace, že člověk musí na serveru debuggovat (na lokále to funguje, na produkčním ne), ale to je výjimečně. Ale vždycky používám na serveru Laděnku jako zachytávač a logovač chyb.

    před 5 lety
  7. juzna.cz http://juzna.cz #7

    avatar

    #2 Chytraku, Jeste jsem nevidel, ze by to XDebug umel podat v nejake slusne forme. Nemas screenshoty? Ladence to slusi!

    před 5 lety
  8. Peggy #8

    avatar

    Leděnka je prostě Best! nedokážu si bez ní, představit život! (programovací..) :)

    Ale jedna věc me opčas trápí, a to že při výpise zkracuje string (doplní tečkami…) … myslim že by užasná fjůčra byla, kdyby se dal zase rozbalit a zobrazit celej…

    Dost to vadí např u SQL dotazů (Dibiho test() to řeší :) ), ale i jinde…

    před 5 lety | reagoval [9] Pilec
  9. Pilec #9

    avatar

    #8 Peggy,
    Tyhle věci jdou řešit přes Debugger::$maxDepth a Debugger::$maxLen a přenastavit je na jiné hodnoty než jsou teď (myslím defaultně 3 a 150) protože větší hodnoty při delším výpisu by neúměrně zatěžovali server.

    před 5 lety
  10. hoprdox #10

    Ten skript ovsem zastavi budto nedefinovana promenna ve strict modu, nebo nedefinova funknce

    před 5 lety
  11. Karel #11

    avatar

    Asi jsem to nepochopil, ale to je nějaký ester egg? Akorát v NDebugger .zip vidím funkci debug, a na githubu nic… Nebo to je coming sson?

    před 5 lety
  12. Petr Soukup http://www.souki.cz #12

    avatar

    Tak jo, já budu za blbce. Jak to funguje? Vžďyt ta proměnná není definovaná. To je na mě nějaké moc magické a skoro bych si i myslel, že je to nějaký předčasný apríl :)

    před 5 lety
  13. David Grudl http://davidgrudl.com #13

    avatar

    Je to trik založený na tom, že proměnná není definovaná. Kdyby byla, nefungovalo by to a bylo by potřeba použít jinou proměnnou.

    Nedefinovaná proměnná vyvolá E_NOTICE, kterou Debugger odchytne a zároveň mu s ní předá všechny lokální proměnné.

    před 5 lety
  14. Tomas #14

    avatar

    Nešlo by pripraviť prefixovanú standalone verziu?

    Chcem to nasadiť na Drupal 7 no ten už funkciu debug() obsahuje.

    před 5 lety | reagoval [15] David Grudl
  15. David Grudl http://davidgrudl.com #15

    avatar

    #14 Tomasi, máš pravdu, prefix bude lepší, změnil jsem funkci na ndebug().

    před 5 lety
  16. Martin #16

    avatar

    Ahoj,
    Ladenka je super. Mam k nej prosim jeden dotaz :-)

    Ked mi vybehne to cervene okno s ‚Fatal Error‘, tak sa mi v title nezobrazuje obsah premennej pri hoveri…

    Nemam cely Nette, len samotnu ladenku…
    Je potrebne nahrat nejaky dalsi subor, alebo nieco nastavit?

    před 5 lety | reagoval [17] David Grudl
  17. David Grudl http://davidgrudl.com #17

    avatar

    #16 Martine, pokud vyskočí Fatal error nebo nezachycená výjimka, tak nelze nijak zjistit obsah proměnných, tudíž se nezobrazují.

    před 5 lety | reagoval [18] Martin
  18. Martin #18

    avatar

    #17 Davide Grudle, Mam este jeden BFU pod-dotaz. Tebe to pri $stop(); nehadze ‚Fatal Error‘?
    Aby som bol presny, PHP hadze ‚Undefined variable‘, ale Ladenka hlasi Fattal Error.
    Vid screenshoot http://img51.imageshack.us/…5/fatalt.png

    před 5 lety | reagoval [19] David Grudl
  19. David Grudl http://davidgrudl.com #19

    avatar

    #18 Martine, Asi používáš verzi z Nette, že? Potom ještě nastav Debugger::$strictMode = TRUE;

    před 5 lety | reagoval [20] Jirin
  20. Jirin #20

    avatar

    #19 Davide Grudle, Mám podobný problém jako Martin. Používám minified verzi (bez Nette), a vyhodi mi to cisty Fatal Error, tudiz zadne lokalni promenne apod…

    před 5 lety | reagoval [21] Jirin
  21. Jirin #21

    avatar

    #20 Jirine, omlouvám se, chyba vyřešena, mel jsem vyple notices:) jdu radeji spat

    před 5 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.