Пример функции: Dump()
В отладочных целях часто бывает нужно посмотреть, что содержит та или иная переменная. Однако, если эта переменная — массив, да еще многомерный, с выводом ее содержимого на экран могут возникнуть проблемы. Решить их призвана следующая функция, которую я назвал Dump(). Пользу от этой функции можно реально почувствовать, лишь поработав с ней некоторое время. Уверяю, потом вы не сможете понять, как раньше без нее обходились…
Функция выводит содержимое любой, сколь угодно сложной, переменной, будь то массив, объект или простая переменная. Как уже говорилось, приведенная функция исключительно полезна при отладке сценариев (которая в PHP пока еще не особенно развита).
В PHP версии 4 для аналогичных целей существуют две стандартных функции — print_r() и var_dump(), но листинг, который они выводят, довольно неудобен для восприятия человеком.
Листинг 11.16. Функция Dump()
// Вспомогательная функция, делающая всю "грязную" работу
function TextDump(&$Var,$Level=0)
{ if(is_array($Var)) $Type="Array[".count($Var)."]";
else if(is_object($Var)) $Type="Object";
else $Type="";
if($Type) {
echo "$Type\n";
for(Reset($Var),$Level++; list($k,$v)=each($Var);) {
if(is_array($v) && $k==="GLOBALS") continue;
for($i=0; $i<$Level*3; $i++) echo " ";
echo "<b>".HtmlSpecialChars($k)."</b> => ", TextDump($v,$Level);
}
}
else echo '"',HtmlSpecialChars($Var),'"'."\n";
}
// Основная функция
function Dump(&$Var)
{ // Подфункция, выводящая практически окончательный результат
if((is_array($Var)||is_object($Var)) && count($Var))
echo "<pre>\n",TextDump($Var),"</pre>\n";
else
echo "<tt>",TextDump($Var),"</tt>\n";
}
В реальной жизни следует использовать функцию Dump(). Функция TextDump() (которая, по правде говоря, и делает всю работу) использует только одну неизвестную нам еще функцию — HtmlSpecialChars(), заменяющую в строке символы типа <, > или " на их HTML-эквиваленты (соответственно, <, > и "). Мы применили дополнительную функцию для того, чтобы вывести сам результат, а главная функция занимается только форматированием этого результата (вставка его в тэги <pre> или <tt> в зависимости от размера вывода).