Лучше использовать ob_get_contents() или $text. = 'Test';
Я видел много ob_get_clean()
последнего времени. Обычно я делал $test .= 'test'
Мне интересно, если кто-то быстрее и/или лучше, чем другой.
Вот код с помощью ob_get_clean()
:
ob_start();
foreach($items as $item) {
echo '<div>' . $item . '</div>';
}
$test = ob_get_clean();
Вот код с помощью $test .= 'test'
:
$test = '';
foreach($items as $item) {
$test .= '<div>' . $item . '</div>';
}
Что лучше?
Ответы
Ответ 1
У выходных буферов есть все подводные камни глобальных переменных. Вы должны знать все пути выполнения от ob_start()
до ob_get_clean()
. Вы уверены, что он доберется туда и что любые буферы, открытые между ними, будут закрыты? Имейте в виду, что код может генерировать исключения. Это может быть очень забавной ошибкой для следующего парня, который будет отслеживать.
С другой стороны - и я ненавижу даже упоминать об этом - однажды буферизация вывода была несколько быстрее при конкатенации больших строк по причинам, внутренним для PHP. Я не уверен, что это правда.
Ответ 2
Результаты те же, и я предполагаю, что различия в производительности незначительны, если таковые имеются. В основном, вопрос личного предпочтения. Я бы сам пошел с конкатенацией - я использую буферизацию вывода только тогда, когда конкатенация не является вариантом.
Кроме того, вместо запуска ob_get_contents() и ob_clean() просто запустите ob_get_clean(), который выполняется одновременно.
Ответ 3
Если вас беспокоит накладные расходы на конкатенацию строк, вы должны отметить, что это:
echo '<div> '. $test. '</div> ';
заметно медленнее, чем это:
echo '<div> ', $test, '</div> ';
Первый компилятор сводится к двум строкам-последовательностям, за которыми следует эхо-сигнал, а второй составляет всего три эха, что на самом деле быстрее.
Ответ 4
Я думаю, что использование буферизации вывода может иметь небольшое преимущество в производительности, когда вы используете массивные строки, но для общего использования вы лучше с конкатенацией, на мой взгляд, поскольку этот код, вероятно, будет легче понять и отладить другие.
Небольшая точка, но если вы собираетесь использовать метод буферизации вывода, вы можете использовать его полностью:
ob_start();
foreach($items as $item) {
echo '<div>';
echo $item;
echo '</div>';
}
$test = ob_get_clean();
Ответ 5
Как уже упоминалось выше, буферизация вывода лучше для производительности. Для больших строк разница в производительности не является вообще пренебрежимой. Вы можете сравнить буферизацию вывода в PHP с StringBuffer/StringBuilder в Java; для конкатенации строк вся строка должна быть скопирована в память каждый раз. Для буферизации вывода текст переходит в буфер, который растет в разумных приращениях, и нет необходимости копировать данные для каждого вывода.
Вы также можете подумать об использовании встроенного HTML (даже быстрее). Добавленное преимущество встроенного HTML заключается в том, что ваша среда IDE может, вероятно, выполнять подсветку синтаксиса в HTML, чего не будет, когда HTML находится внутри строки PHP. Измененный код (short_open_tags = В обязательном порядке):
ob_start();
?>
<? foreach($items as $item) { ?>
<div><?= $item ?></div>
<? } ?>
<?
$test = ob_get_clean();