PHP — print_r и var_dump, ускоряем работу простыми функциями. PHP — print_r и var_dump, ускоряем работу простыми функциями Увольнение print php

Для своего удобства я написал аналог функции print_r . Сразу покажу, чем она отличается:

UPD: добавлена разметка и стиль для корректного отображения пустых массивов и объектов.

UPD: добавлено отображение количества дочерних элементов массива или свойств объекта (число справа от названия ключа массива).

UPD: добавлена возможность сворачивать дочерние массивы массива (клик по количеству дочерних).

UPD: добавлено отображение файла и строки, откуда была вызвана функция.

UPD: теперь параметры в функцию можно передавать не массивом, а поштучно, причём в любом порядке.

Что функция умеет

  • выводить скалярные переменные, массивы, объекты, ресурсы;
  • выделять цветом тип данных;
  • выделять цветом область видимости свойств;
  • явно отображать значения булевых переменных и NULL ;
  • выводить тип ресурса;
  • автоматически обрезать длинные строки;
  • выводить массив в виде дерева, с возможностью сворачивания узлов (ради чего всё это было затеяно);
  • выводить дерево в свёрнутом виде или развёрнутым до определённого ключа;
  • отображать файл и строку, откуда была вызвана функция;
  • засекать время, прошедшее между двумя вызовами функции;
  • искать текст в ключах и значениях массивов.

И самое главное

Никаких внешних зависимостей!

Как использовать

Нужно подключить файл nf_pp.php

Include "nf_pp.php";

и можно пользоваться

Pp($val);

Опции

Вторым аргументом в функцию можно передать массив параметров.

Pp($val, array("trimString" => 0));

Доступны такие опции:

UPD: мне надоело передавать параметры в функцию массивом и я сделал, чтобы их можно было передавать прямо так, причём в любом порядке. Пример:

Pp($val, 300, "КириЛлиЦА");

Pp($val, "КириЛлиЦА", 0);

Pp($val, "КириЛлиЦА");

Парамертры определяются по типу. Если передано число, то это — trimString , если булев параметр, то это — autoCollapsed ; если строка или массив, то это — autoOpen .

Примеры использования

Просто вывести массив

Pp($val);

Вывести массив в свёрнутом виде

Pp($val, array("autoCollapsed" => TRUE));

Вывести массив, раскрытый до ключей «c» и «subarray»

Pp($val, array("autoOpen" => array("c", "subarray")));

Вывести массив, раскрытый до ключа «c»

Pp($val, array("autoOpen" => array("c")));

Pp($val, array("autoOpen" => "c"));

Тех, кто считает себя профессиональным программистом на PHP. Руководство пользователя осторожно упоминает об имеющемся различии, но отсылает к статье стороннего авторства ; та, в свою очередь, утверждает, что echo быстрее, но не приводит доказательств; трудно найти объективное сравнение, и всё это придаёт проблеме некий мистический ореол, на что клюют многие и многие.

Так не будем же оставаться в стороне и постараемся раз и навсегда разгадать эту загадку!

Поведенческое различие echo и print заключается в том, что последний может вести себя как функция (всегда возвращающая единицу); вследствие этого print можно использовать в контексте, например, тернарного оператора, что иногда может быть весьма привлекательным. Echo как функцию использовать нельзя, зато она может принимать несколько аргументов через запятую, при этом их нельзя брать в скобки; тогда как у print ровно один аргумент, и он может быть как в скобках, так и без.

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

Для проведения испытаний я составил стенд, на котором 1000 раз выводятся 1000 строк (длиной 32 символа каждая); при этом используется один из пяти методов:

  1. print "$value
    ";
  2. echo "$value
    ";
  3. print $value . "
    ";
  4. echo $value . "
    ";
  5. echo $value, "
    ";

Для каждого из методов испытания проводились 20 раз, при этом каждый раз засекалось время. Распределение результатов для всех методов оказалось нормальным, что позволяет брать среднюю величину как показатель быстродействия.

Были получены следующие величины:

  1. 1,727 с
  2. 1,727 с
  3. 1,462 с
  4. 1,428 с
  5. 1,321 с

Действительно, мы видим что print может оказаться немного медленнее echo (а может и не оказаться, что демонстрируют результаты по первым двум методам). В то же время использование echo с несколькими параметрами взамен конкатенации (и одинарными кавычками вместо двойных) даёт весьма ощутимый выигрыш в производительности.

Но постойте, на самом ли деле он такой ощутимый? Давайте подсчитаем. Разница между минимальным и максимальным временем составляет 406 мс на миллион операций. То есть, как сейчас модно говорить, 406 наносекунд на одну операцию .

Что это нам даёт в масштабах - ну, скажем, «ВКонтакте»? По данным LiveInternet, ежедневно на нём просматривается 500 млн. страниц .

Сколько раз для каждой страницы вызывается echo или print? Современные успешные сайты обязательно прибегают к сколько-нибудь высокому уровню абстракции логики от представления, используя шаблоны, MVC и другие страшные слова; в результате операция вывода вызывается один раз на страницу или, как максимум, один раз для каждого смыслового блока страницы. Предположим худший вариант и оценим количество таких блоков в 10 шт. на одну страницу.

Нетрудно подсчитать, что экономия серверного времени составит в лучшем случае до 200 секунд в день , или 0,23 %. Много это или мало? Решайте сами. Только сначала подумайте, не принесёт ли оптимизация одного SQL-запроса или кэширование одного файла в несколько раз больший прирост производительности.

А я скажу, сколько времени у меня заняло решение этого вопроса:

  1. Просмотр информации в мануале - 2 минуты.
  2. Составление бенчмарка - 31 минута.
    Серия пробных экспериментов - 5 минут.
    Корректирование техники и методики тестирования - 20 минут.
    Проведение испытаний - 9 минут.
    Обработка результатов - 5 минут.

В php есть жизненно необходимые функции, без которых разработчику просто не обойтись. Речь пойдет о print_r и немного про var_dump 🙂

Зачем нужны print_r и var_dump?

print_r чаще всего используют для массивов и основной задачей является именно узнать, какие ключи (если это ассоциативный массив или с большим уровнем вложенности многомерный) и значения находятся в массиве. Записывается следующим образом:

Нам на экраны выдаст следующий результат:

Array ( => 1 => 2 => 3 => 4 => 5 => 6 => 7 => 8 => 9)

Несмотря на свою простоту, данный массив сложно читается, а если бы его структура состояла из нескольких уровней, то найти нужную информацию было бы очень затруднительно. К счастью, в HTML есть тег, который поможет с этим справиться, это тег pre :

Echo "

";
print_r($arg);
echo "
";

Как видно из кода, print_r записывается между тегами pre, и в результате видим следующую картину:

Array ( => 1 => 2 => 3 => 4 => 5 => 6 => 7 => 8 => 9)

Особенность тега pre еще и в том, что он отображает все символы пробелов, если вы указываете много пробелов, они записываются как один:
«По умолчанию, любое количество пробелов идущих в коде подряд, на веб-странице показывается как один.»
То есть, такая запись:

Привет как дела?

Привет как дела?

Для массивов считаю что print_r это инструмент номер один 🙂

Зачем нужен var_dump?

Для обычных переменный, которые содержат строки, числа и т.д. есть простые способы вывода — echo и print . Но иногда этого недостаточно, в PHP у каждого значения есть свой тип . Есть правда неприятная особенность, тип может меняться, и запись:

Echo $a = 15 + "19";

Выдаст следующее значение:

Хотя мы передали одно число и одну строку. var_dump позволяет узнать к какому типу данных относится значение:

int сокращение от integer — целое число. Записывается не сложнее чем print_r:

Echo "

";
var_dump($arg);
echo "
";

Тип данных это важная вещь, но лично я print_r`ом пользуюсь гораздо чаще.

print_r и var_dump в 1С-Битрикс

В битриксе есть файл, который выполняется при каждой загрузке страницы — init.php , и для того чтобы каждый раз не писать много кода, можно записать 2 простые функции:

"; print_r($arg); echo ""; } function vd($arg) { echo "

";
 var_dump($arg);
 echo "
"; }

После записи можно передавать переменную, и что самое главное, массив. Запись для вызова будет следующая.

В прошлый раз мы разбирали с вами тему массивов в php , а сегодня мы с Вами разберем функцию, которая называется print_r() . Данная функция является отладочной, и предназначена нам для того, чтобы мы могли в удобном виде просмотреть информацию о переменной. Почему я вначале темы затронул массивы, а это потому, что лучше всего при помощи этой функции просматривать массивы. Сейчас Вы в этом убедитесь.

$array = array(5 , 23 , "Denis" ) ;
print_r($array) ;
?>

Мы использовали массив из прошлого урока, и применили к нему функцию print_r . Показывать результат выполнения этой функции я не вижу смысла, просто напишите этот код и посмотрите результат в браузере. Там мы увидим, ключевое слово Array , и в скобках будут последовательно перечисляться индексы и их значения. Таким образом, мы можем просматривать даже самые большие массивы при помощи одной строчки. Это все, что я хотел рассказать про эту функцию. Вот такая сегодня получилась маленькая, легкая, а самое главное полезная статья. До скорой встречи!

10 years ago

Be careful when using print. Since print is a language construct and not a function, the parentheses around the argument is not required.
In fact, using parentheses can cause confusion with the syntax of a function and SHOULD be omited.

Most would expect the following behavior:
if (print("foo" ) && print("bar" )) {
}
?>

But since the parenthesis around the argument are not required, they are interpretet as part of the argument.
This means that the argument of the first print is

("foo") && print("bar")

and the argument of the second print is just

For the expected behavior of the first example, you need to write:
if ((print "foo" ) && (print "bar" )) {
// "foo" and "bar" had been printed
}
?>

So what should you choose to print your text? I found several things out writing this.

First, it should be noted that the print and echo keywords are interchangeable, performance-wise. The timings show that one is probably an alias for the other. So use whichever you feel most comfortable with.

Second, if you"ve ever wondered which was better, the definitive answer is single quotes. Single quotes are at least four times faster in any situation. Double quotes, while more convenient, do pose a debatably significant performance issue when outputting massive amounts of data.

Third, stay away from heredoc, and absolutely stay away from [s]printf. They"re slow, and the alternatives are there.

DO NOT RUN THE SCRIPT ON THE INTERNET! Run it instead from localhost. The script outputs ~45 megabytes of text in an html comment at the top of the page by default. Expect the benchmark to take ~45 seconds. If this is too long, you can change the amount of iterations to a lower number (the results scale accurately down to about 1,000 iterations).

Похожие статьи