Na navigaci | Klávesové zkratky

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 #1

    avatar

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

    před 12 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 12 lety | reagoval [3] David Grudl [7] juzna.cz
  3. David Grudl #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 12 lety
  4. Chytrak #4

    Ty profiluješ na serveru?

    před 12 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 12 lety
  6. David Grudl #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 12 lety
  7. 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 12 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 12 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 12 lety
  10. hoprdox #10

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

    před 12 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 12 lety
  12. Petr Soukup #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 12 lety
  13. David Grudl #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 12 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 12 lety | reagoval [15] David Grudl
  15. David Grudl #15

    avatar

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

    před 12 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 12 lety | reagoval [17] David Grudl
  17. David Grudl #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 12 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 https://web.archive.org/…5/fatalt.png

    před 12 lety | reagoval [19] David Grudl
  19. David Grudl #19

    avatar

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

    před 12 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 12 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 12 lety

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


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.