Print_r зі згортанням вузлів. Функція print() - Виводить рядок Безмірний print php

Тих, хто вважає себе професійним програмістом на 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(). Ця функція є налагоджувальною, і призначена нам для того, щоб ми могли в зручному вигляді переглянути інформацію про змінну. Чому я спочатку теми торкнувся масивів, а це тому, що найкраще за допомогою цієї функції переглядати масиви. Зараз Ви в цьому переконаєтесь.

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

Ми використовували масив з минулого уроку і застосували до нього функцію print_r. Показувати результат виконання цієї функції я не бачу сенсу, просто напишіть цей код і перегляньте результат у браузері. Там ми побачимо, ключове слово Array, і в дужках послідовно перераховуватимуться індекси та їх значення. Таким чином, ми можемо переглядати навіть найбільші масиви за допомогою одного рядка. Це все, що я хотів розповісти про цю функцію. Ось така сьогодні вийшла маленька, легка, а найголовніше – корисна стаття. До скорої зустрічі!

Для своєї зручності я написав аналог функції 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"));

Це є простим функцією для printing debug comments that I didn"t think of for a long time. Maybe it"ll serve you good too.

Function printd ($str) (
if ($debug) ( echo $str ; )
}

// ...

If ( $valueCalculatedEarlierInTheScript== 3 ) {
doSomethingWithNoOutput();
printd ( "doSomethingWithNoOutput() має executed.");
}

?>

Це "більше, щоб зробити все, що бігає без того, щоб йти через все і йти в echo "Step #whatever has executed" whenever something mysterious isn"t working.

У мене є маленька utility run з command line що процеси, а також потенційно huge list of files. As it can take hours to complete, I stuck a

Statement in the body of the main loop to prove that something was happening.

Для умов невідомо мені, на користь suddenly started buffering the output such that it printed nothing until completion, defeating the purpose of the running monitor. Adding flush() statements did nothing. The problem was solved by using

Fputs(STDOUT, ".");

But I have no idea why.

I має написаний script до benchmark the several methods of outputting data in PHP: via single quotes, double quotes, heredoc, and printf. Скрипт збудування тексту з одним методом. Це рішення, що це 10,000 times, then records how long it took. In total, it prints 160,000 times and records 16 timings. Here are the raw results.

Outputted straight to browser--

Single quotes: 2,813 ms
...with concatenation: 1,179 ms
Double quotes: 5,180 ms
...with concatenation: 3,937 ms
heredoc: 7,300 ms
...with concatenation: 6,288 ms
printf: 9,527 ms
...with concatenation: 8,564 ms

Outputted to the output buffer--

Single quotes: 8 ms
...with concatenation: 38 ms
Double quotes: 8 ms
...with concatenation: 47 ms
heredoc: 17 ms
...with concatenation: 49 ms
printf: 54 ms
...with concatenation: 52 ms

Хороший граф script"s output can be found here:
http://i3x171um.com/output_benchmarks/ob.gif

Коли ви повинні вибрати друк вашого тексту? Я знаю several things out writing this.

Перший, він повинен бути помічений, що print and echo keywords є interchangeable, performance-wise. The timings show that one is probably an alias for the other. Якщо ви користуєтеся ним, скоріше 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. data.

Third, stay away from heredoc, і absolutestay away from [s]printf. Вони "slow, and the alternativas there."

The source of my script can be found here:
http://i3x171um.com/output_benchmarks/ob.txt

DO NOT RUN THE SCRIPT ON THE INTERNET! Run it instead from localhost. Script outputs ~45 megabytes of text in html comment at the top of the page by default. Expect the benchmark toe ~45 seconds. Якщо це те, що довго, ви можете змінити обсяг ітерацій до найменшого числа (results scale accurately down to about 1,000 iterations).

I wrote a println function that determines whether a \n or a
should be appended to the line depending on whether it's being executed in a shell or a browser window.

function println ($string_message) (
$_SERVER [ "SERVER_PROTOCOL" ] ? print "$string_message
" : print "$string_message\n" ;
}
?>

Examples:

Running in a browser:


Output: Hello, world!

Running in a shell:


Output: Hello, world!\n

Be careful when using print. Зовнішній друк є мовою структури і не є функцією, parentheses around the argument is not required.
У fact, використовуючи parentheses може викликати згоди з syntax of function and SHOULD be omited.

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

Але невідомо, що parenthesis на основі argument не є потрібним, вони є interpretet as part of the argument.
Ці засоби that the argument of the first print is

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

And the argument of the second print is just

Для того, щоб відповісти behavior of the first example, you need to write:
if ((print "foo" ) && (print "bar" )) (
// "foo" and "bar" had been printed
}
?>

An update to the println function I wrote below, this is a more efficient, correct and returns a value (1, always; (print)).

Function println ($string_message = "") (
return isset($_SERVER ["SERVER_PROTOCOL"]) ? print "$string_message
" . PHP_EOL :
print $string_message. PHP_EOL;
}

?>

Mvpetrovich of 2007 можна just using single quotes as his string delimiters (see the example in the current documentation).
Це не є ALWAYS, але це є найбільшим (Zend Framework coding standards has a good take on this).
1: Nobody will be tempted to write functions to replace backticks or other characters with double quotes. Такі функції можуть спричинити (невідповідні) втрати ефективності, а також інші undesired effects.
2: Ви можете прийняти дві quotes без escaping. Це означає, що (не потрібно) для HTML і XML атрибутів, як добре quoted text.
3: Підказка буде завантажити браузер дуже лагідно простий простір since PHP не може сканувати через string looking for variables, escaped characters, curly braces or other things.
4: Your code gets times easier to read. (As mvpetrovich pointed out)

Якщо в стилі цих чотирьох добрих боєприпасів, ви дійсно повинні мати дві quotes для обмеження довжини string constants (і серйозно, коли вам?), Ви можете використовувати приємно незрівнянно низку quotes as delimiters for most.
HTML served as HTML will even let you lay out unquoted attributes (yuck).

Вона повинна бути усвідомлена, що якщо ви маєте just printing bare strings, ви можете добре йти від php parser. Звичайний спосіб, щоб дізнатися про те, що написано, як плагін текст, OUTSIDE of php tags. Це буде також зробити ваш код виглядає досконало в безлічі syntax highlighters.

Там є кілька суперечок про те, якщо це. Output buffering still works. Всі ваші classes and objects і включають remain in place. Your script runs faster World peace is obtained.