Отправляет email-рассылки с помощью сервиса Sendsay

PHP понемножку

  Все выпуски  

PHP понемножку. Самые главные функции.


Все, кто занимается разработкой и написанием кода делают ошибки. Это относится не только к PHP, а к любому языку программирования. Потому средства отладки занимают важное место в арсенале любого программиста. PHP ими тоже не обделён. Ошибки фатальные, связанные с неправильным синтаксисом обычно выдаются прямо в браузер. Но вот второй тип ошибок, которые называются ошибками времени выполнения отслеживать гораздо труднее. Чаще всего они связаны со значениями переменных вашего скрипта.

К примеру, какая-нибудь функция ожидает булево значение, а оно на самом деле целое. Масса проблем связана с NULL-значениями. Неявное преобразование типов в PHP тоже добавляет головной боли. В любом проекте рано или поздно наступает момент, когда просто необходимо узнать, а все ли внутри выглядит и происходит так, как было вами задумано и спроектировано.

Поэтому, можете со мной не соглашаться, но я считаю, что главными функциями в PHP являются две: print_r и var_dump. Именно они и позволяют просмотреть значения и типы переменных скрипта во время его выполнения, что является самым простым и доступным способом его отладки.

var_dump — выводит информацию о переменной.

Описание аргументов и значений.
void var_dump ( mixed $expression [, mixed $expression [, $... ]] )

Функция отображает структурированную информацию об одном или нескольких выражениях, которая включает в себя их тип и значение. Массивы и объекты анализируются рекурсивно с разным отступом у значений для визуального отображения структуры. В PHP 5 все общедоступные, закрытые и защищенные свойства объекта также будут показаны в выводе. Функция выводит непосредственно в браузер. Вывод не отформатирован в HTML-теги, поэтому выводится в одну строчку. Чтобы видеть массивы и отступы, потребуется заключать вывод функции в теги PRE. Для сохранения вывода в строковой переменной, необходимо использовать функции контроля вывода, чтобы перехватывать выводимые этой функцией данные. Функция не возвращает значения после выполнения.

Список параметров

$expression – Выражение для вывода в браузер. Выводимых выражений или переменных может быть несколько.

Примерный вид вывода функции var_dump():

array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
}
}

print_r() – Выводит информацию о переменной в удобочитаемом виде.

Описание аргументов и значений.
mixed print_r ( mixed $expression [, bool $return ] )

print_r() и var_dump() могут также показывать защищенные (protected) и закрытые (private) атрибуты объектов в PHP 5. Статические элементы класса не будут отображены. Следует помнить, что print_r() установит внутренний указатель массива в его конец. Используйте функцию reset() для установки его в начало массива.

Список параметров

$expression – Выражение для вывода в браузер.
$return –  Если Вы хотите перехватить вывод print_r(), используйте параметр $return . Если его значение равно TRUE, то print_r() вернет результат вывода вместо вывода в браузер (который производится по умолчанию). При выводе функция использует внутренний буфер вывода, поэтому  ее нельзя использовать с этим параметром после вызова функции контроля вывода ob_start(). Параметр  $return появился только в версии 4.3.0. В более ранних версиях приходилось использовать функции контроля вывода.

Возвращаемые значения

Если в функцию передаются значения типов string, integer или float, будет напечатано само значение. Если передается массив array, значениия будут напечатаны в формате, показывающем ключи и элементы массива. Аналогичный формат вывода используется для объектов.

До версии 4.0.4 print_r() зацикливалась, если передавался массив или объект, который содержал прямую или косвенную ссылку на себя. В более старших версиях такой массив или объект обозначается словом *RECURSIVE*

Примерный вид вывода print_r() более компактен, чем у var_dump(), но не содержит информации о типах переменных:

Array
(
[a] => apple
[b] => banana
[c] => Array
(
[0] => x
[1] => y
[2] => z
)
)

Примеры практического кода:

Обычный способ использования функций

<pre><?php print_r($var) ?></pre>
<pre><?php var_dump($var) ?></pre>

Если в вашем проекте прямой вывод HTML cразу нежелателен, то вывод функций можно поместить в переменные.

$out = '<pre>'.print_r($var,true).'</pre>';
...
print $out;
С var_dump() приходится использовать контроль вывода.
ob_start();
var_dump($var);
$out = ob_get_contents();
ob_end_clean();
...
print $out;

Ну а если в полях отображаемого объекта или в переменных содержится HTML-код, то его вывод следует защитить функцией htmlspecialchars():

$out = '<pre>'.htmlspecialchars(print_r($var,true)).'</pre>';
...
print $out;

Пользовательское решение

В случае очень громоздких переменных с большим числом полей содержащих массивы и объекты вывод обоих функций становится неудобен и плохо читаем. В этом случае можно предложить пользовательскую реализацию функции, которая дает более наглядный HTML-код.

function print_r_html($val, $key=NULL){
  static $i = 0;
  $i++;
  $type = gettype($val);
  $label = isset($key) ? "<strong>".htmlspecialchars($key)."</strong> =&gt; " : "";
  $style = ($i == 1 ? "" : "display: none; ");
  print "<div id=\"array_tree_$i\" class=\"array_tree\" style=\"margin-left: 10px\">";
  switch ($type) {
    case "array":
    case "object":
      if (isset($key)) {
        print "<strong><a onclick=\"document.getElementById('";
        print "array_tree_element_$i').style.display = ";
        print "document.getElementById('array_tree_element_$i";
        print "').style.display == 'block' ?";
        print "'none' : 'block';\" ";
        print "name=\"array_tree_link_$i\"";
        print "href=\"#array_tree_link_$i\">".htmlspecialchars($key)."</a></strong> =&gt; ";
      }
      if($type=="array") print "Array (".count($val).")";
      if($type=="object") print "Object <strong>".get_class($val)."</strong>";
      print "<div class=\"array_tree_element_\" id=\"array_tree_element_$i\" style=\"$style\">";
      foreach($val as $k=>$v) {
        print print_r_html($v, $k);
      }
      print "</div>";
    break;
    case "integer":
    case "double":
      print $label . "<em>".htmlspecialchars($val)."</em>";
    break;
    case "boolean":
      print $label . ($val ? "true" : "false" );
    break;
    case "string":
      if(strlen($val)>255 &&
isset($key)) {
        print "<strong><a onclick=\"document.getElementById('";
        print "array_tree_element_$i').style.display = ";
        print "document.getElementById('array_tree_element_$i";
        print "').style.display == '' ?";
        print "'none' : '';\" ";
        print "name=\"array_tree_link_$i\"";
        print "href=\"#array_tree_link_$i\">".htmlspecialchars($key)."</a></strong> =&gt; ";
        print "<code>".htmlspecialchars(substr($val,0,255));
        print "<span id=\"array_tree_element_$i\" style=\"$style\">".htmlspecialchars(substr($val,255))."</span>";
        print "</code>";
      }
      else {
        print $label . "<code>".htmlspecialchars($val)."</code>";
      }
    break;
    default:
      print $label.gettype($val);
    break;
  }
  print "</div>";
}

В выводе этой функции нескалярные величины (массивы и объекты) свернуты и разворачиваются при щелчке по ним правой кнопкой мыши. Так же происходит обрезание текстовых полей до 255 символов с раскрыванием их при щелчке по имени поля.

 

Воронин Валентин, shaman.asiadata.ru

 


В избранное