Výpis ladících informací
Školení, která pořádám
Když chcete v PHP vypsat proměnnou za účelem ladění, máte kromě běžného echo, které nedokáže vypsat např. jednotlivé prvky pole, k dispozici několik dalších funkcí. Já mám nejraději funkci print_r, která má přehledný výstup, ale bohužel neobsahuje všechny informace, které jsou někdy potřeba (např. false, null ani prázdný řetězec nijak nevypíše). Nejúplnější informaci včetně typů a referencí poskytne funkce var_dump. Do třetice všeho dobrého je k dispozici funkce var_export, která vypíše proměnnou v podobě, kterou lze přímo použít jako PHP kód. Funkce debug_zval_dump navíc informuje o počtu referencí.
<?php
$ar = array(false);
echo $ar; // Array
print_r($ar); // Array ([0] => )
var_dump($ar); // array(1) { [0]=>bool(false) }
var_export($ar); // array ( 0 => false, )
debug_zval_dump($ar); // array(1) refcount(2){ [5]=>long(3) refcount(1) }
?>
Diskuse
Leo:
Jenom jednu poznamku - pokud udelate ladici vystup do prohlizece ve skriptu, ktery jinak vystup nedela (jen treba presmerovani), mate obvykle problemy s kesovanim - udelate zmenu, ale prohlizec ma v kesi starou verzi skriptu a vy jak blbci hledate chybu v programu. Leo
Jan Tichý:
Já vim, že jsem hnidopich, ale ty informace jsou ladicí, a nikoliv ladící :-).
Yuhů:
Také je dobré dávat pozor na to (podobně jako zmínil Leo), aby se ladící hlášky vypisovaly před http hlavičky nastavené PéHáPkem. Ale to naštěstí pak plive chyby rovnou na výstup.
Leo:
Treba by slo vymyslet i neco aby se ty hodnoty nevypisovaly primo do stranky. Napada me, ze misto printu nebo obdoby by ty hodnoty sly strcit do cookie a nacist JavaScriptem (idealne bookmarklet). Leo
spaze:
nebo proste klasickej log, baliku na to bude parta.
tark:
Jen doplním, že já třeba používám tohle, protože jinak se v tom nevyzná ani prase
<?php
function debug_apps($var) {
echo '<pre>';
print_r($var);
echo '</pre>';
}
?>
Jakub Podhorský:
stačí si prohlídnout kód stránky a tam je to pěkně seřazený...imho u malých polí mně to nedělá problém se v tom vyznat
tark:
ale ano, jenomže ... kdo má furt zobrazovat zdroják? :)
Jakub Podhorský:
mně osobně to moc nevadí :) i když je fakt že se občas divím proč jich v liště mám otevřenejch 10 :) a navíc jsem línej a <pre> mě nebaví psát :)
spaze:
ja na to mam zkratku.. napisu pre, ctrl+spaze a mam <?php printf('<pre>%s</pre>', print_r(_K_, TRUE)); ?>, kde _K_ je kurzor.
tark:
Proto mám debug_apps($arr) :))
marau:
a co tohle:
<?php
function myprint($var)
{
echo '<pre>';
print_r($var);
echo '</pre>';
}
$i = array('5' , '6');
myprint($i);
?>
Místo print_r() se píše myprint(). Co do počtu znaků je to nastejno. Nic ale nikomu nebrání to ještě zkrátit.
PeTaX:
Osobně používám už dlouho tuto variantu:
<?php
function _dump($a)
{
return sprintf('<xmp>%s</xmp>',var_export($a,TRUE));
}
?>
A pak kdekoliv ve fci:
<?php
return self::_dump($_POST); // či jiná sada dat
?>
Jakub Vrána :
Ještě je potřeba data ošetřit pomocí htmlspecialchars().
Tomáš (ATom):
Podle mě je jendoznačně nejlepší použít vlastní funkci nebo ještě lépe něco jako Log::debug(), protože pak je možné to co se stane globálně řídit implementací té metody. Nestane se vám tak, že na ostrém provozu aplikace někde ponecháte omylem print_r().
Jakub Podhorský:
tak lepší editory používají hromadné prohledávání souborů pak je stačí projet a smazat ty výskyty :)
ale souhlasím s tebou že tohle je nejlepší řešení
Tomáš Fejfar:
Osobně používám vlastní funkci:
<?php
function tell($text,$die = FALSE, $pre = FALSE, $color = "red", $annot = ""){
if(SERVER != "live"){
echo '<div style="font-size:10px;text-align:left !important;z-index:5;background-color:white;width:300px;padding:3px;margin:5px;border:solid '.$color.' 2px; color:'.$color.'; font-weight:bold;"><p>';
if($pre){
echo "<pre>".LR;
}
echo $annot.$text;
if($pre){
echo "</pre>".LR;
}
echo '</p></div>';
if($die){
die();
}
}
}
?>
A v konfigu serveru mam vždycky konstantu SERVER, která se nastaví podle toho jestli jedu na debug, local nebo live ;)
Diskuse je zrušena z důvodu spamu.