Výpis ladících informací
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
8.8.2005 10:33:36
Jan Tichý:
Já vim, že jsem hnidopich, ale ty informace jsou ladicí, a nikoliv ladící :-).
8.8.2005 10:35:58
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.
8.8.2005 14:10:44
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
8.8.2005 18:06:01
nebo proste klasickej log, baliku na to bude parta.
9.8.2005 16:40:50
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>';
}
?>
9.8.2005 22:12:46
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
10.8.2005 17:43:09
tark:
ale ano, jenomže ... kdo má furt zobrazovat zdroják? :)
11.8.2005 19:23:48
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 :)
11.8.2005 21:01:24
ja na to mam zkratku.. napisu pre, ctrl+spaze a mam
<?php printf('<pre>%s</pre>', print_r(_K_, TRUE)); ?>, kde _K_ je kurzor.
12.8.2005 13:53:52
tark:
Proto mám debug_apps($arr) :))
14.8.2005 23:14:29
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.
2.12.2005 14:58:35
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
?>
17.8.2018 09:26:14
Ještě je potřeba data ošetřit pomocí htmlspecialchars().
25.8.2018 10:38:23
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().
16.8.2005 20:58:14
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í
16.8.2005 21:54:51
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 ;)
27.9.2007 19:16:35