Вывод PHP/HTML: эхо против возврата, буферизация вывода и проблемы с подсветкой синтаксиса
Я предпочитаю писать html вне тегов php, чтобы eclipse мог отображать html с правильной подсветкой синтаксиса. Метод конкатенации сложнее написать и не выделяет его (см. Два примера ниже).
Я прошу прощения за длину. Эти примеры очень просты, поэтому их легко прочитать.
Мне не нравится это, слишком много "кавычек" и $o, и нет подсветки синтаксиса!:
<?php
display($something){
$o = '';
$o .= '<div>';
$o .= $something;
$o .= '</div>';
return $o;
}
// I want to be able to do this:
echo display(display('something'));
Это дает функции возможность завершить закрытие <tag>
или даже добавить дополнительные HTML потом. Приведенный выше пример является функционально тем, что я собираюсь сделать, но по этим причинам ("кавычки", $o и подсветка синтаксиса) я не создал такую систему.
В следующем примере я предпочитаю писать html, но не могу вложить вывод, потому что он не возвращается!
<?php
function display($something){ ?>
<div>
<?=$something?>
</div>
<?php }
// I'd like to do this, but I can't
display(display('this doesn't return anything to the first function call...'));
Это где буферизация выходных данных, я вернусь к этому через секунду...
Что я предполагаю:
Я хотел бы иметь возможность использовать func_get_args()
чтобы выполнить что-то вроде этого (обратите внимание, это будет применяться к объектам ООП, здесь все будет просто):
<?php
some_panel( title_style_1('Sample Header'),
panel_content(you_tube($vid_id)),
small_img_frame($img_src) );
По сути, вы сможете использовать любую из этих функций вывода и вкладывать их так, как вам нравится. Так же, как вы можете поставить любой <div>
внутри любого <p>
и наоборот. Единственная проблема в том, что вы должны убедиться, что закрыли теги... И, в этом случае, вы можете добавить любую разметку в конце или между дочерними элементами.
Это где выходной буферизации приходит
<?php
function display($something){
ob_start(); // <---- Start buffer ?>
<div>
<?=$something?>
</div>
<?php return ob_end_clean(); // <------ Return output
}
// Now I can do this!!!
echo display(display('this should work!'));
И, барабанная дробь, пожалуйста.... ВОПРОС:
Если я неоднократно буду буферизовывать потенциально сотни или даже тысячи раз за запрос, это будет ударом по производительности? Я прочитал сообщения, которые предупреждают о буферизации вывода из-за:
Надежность: если где-то еще был запущен буфер, из того, что я прочитал, это звучит как гнездо и потенциально может конфликтовать.
Ремонтопригодность: если буфер запущен, вы должны гарантировать, что он будет остановлен.
Для моей системы, если буферизация вывода запускается и останавливается при одном и том же вызове функции, эти вещи кажутся нормальными. Это чрезмерная итерация потенциально 1000 элементов, каждая из которых запускает / останавливает буферизацию вывода для одного <li>
что я волнуюсь
Кроме того, если кто-то знает какие-либо фреймворки или лучшие способы сделать то, что я пытаюсь сделать, любые предложения будут оценены!
2 ответа
Как насчет вложенного вывода через… output?
<?php
function foo($itemName) {
?>
<div class="item">
<?php bar($itemName); ?>
</div>
<?php
}
function bar($itemName) {
?>
<h1><?= $itemName ?></h1>
<p>Hello, world!</p>
<?php
}
?>
Но чтобы ответить на остальную часть вопроса: отметьте это! Буферизация выходных данных обычно не является проблемой, но она может стать чьим-либо узким местом. Это зависит.
Если вы обнаружите, что часто делаете подобные вещи, рассмотрите возможность разбить их на несколько файлов или использовать систему шаблонов. Или не PHP.
Выходная буферизация, вероятно, является промывкой, она может даже улучшить производительность. Затрачиваемая впустую буферизация процессора сохраняется при меньшем количестве операций ввода-вывода. Написание сокетов - это тысячи инструкций. Единственный раз, когда это может стать проблемой, - это когда объем вывода отрицательно повлияет на использование памяти. И если вы буферизуете много мегабайт выходных данных, вам, вероятно, нужно изучить какую-то форму потоковой передачи.
Вот более старая статья на эту тему: буферизация вывода PHP - звучит как плохая идея, не так ли?