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) }
?>
Jakub Vrána, Seznámení s oblastí, 8.8.2005, diskuse: 18 (nové: 0)

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í :-).

ikona spaze:

doplnim: http://www.atomar.de/public/code/debuglib/debuglib.demo.php print_r() na steroidech

ikona 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

ikona 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 :)

ikona 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
?>

ikona Jakub Vrána OpenID:

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.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.