Лучше использовать 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();