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:
![](/images/debugger-source1.png)
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:
![](/images/debugger-source2.png)
K dispozici je přehled všech proměnných, které byly funkci předány (pod záložkou Callstack):
![](/images/debugger-arguments.png)
A přehledně vypsané všechny lokální proměnné, složitější struktury můžete kliknutím rozbalit:
![](/images/debugger-variables.png)
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:
![](/images/debugger-callstack.png)
Níže najdete všechny informace o HTTP požadavku, počínaje hlavičkami přes cookies k GET/POST proměnným:
![](/images/debugger-http.png)
A nechybí ani pole $_SERVER
, konfigurační direktivy,
konstanty atd:
![](/images/debugger-environment.png)
Dokáže tohle váš framework? ? Pokud ne, seznamte ho s Laděnkou.
Komentáře
Olda #1
Like, bez laděnky si už PHP ani nepředstavuji, mělo by být součástí přímo PHP :)
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š…
David Grudl #3
#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).
Chytrak #4
Ty profiluješ na serveru?
Michal Kleiner #5
Chytraku, pro použití Laděnky z Nette se nemusí nikde nic instalovat/nastavovat jako v případě xdebugu.
David Grudl #6
#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.
juzna.cz #7
#2 Chytraku, Jeste jsem nevidel, ze by to XDebug umel podat v nejake slusne forme. Nemas screenshoty? Ladence to slusi!
Peggy #8
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…
Pilec #9
#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.
hoprdox #10
Ten skript ovsem zastavi budto nedefinovana promenna ve strict modu, nebo nedefinova funknce
Karel #11
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?
Petr Soukup #12
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 :)
David Grudl #13
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é.
Tomas #14
Nešlo by pripraviť prefixovanú standalone verziu?
Chcem to nasadiť na Drupal 7 no ten už funkciu debug() obsahuje.
David Grudl #15
#14 Tomasi, máš pravdu, prefix bude lepší, změnil jsem funkci na
ndebug()
.Martin #16
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?
David Grudl #17
#16 Martine, pokud vyskočí Fatal error nebo nezachycená výjimka, tak nelze nijak zjistit obsah proměnných, tudíž se nezobrazují.
Martin #18
#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 https://web.archive.org/…5/fatalt.png
David Grudl #19
#18 Martine, Asi používáš verzi z Nette, že? Potom ještě nastav
Debugger::$strictMode = true;
Jirin #20
#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…
Jirin #21
#20 Jirine, omlouvám se, chyba vyřešena, mel jsem vyple notices:) jdu radeji spat
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.