Лучше использовать ob_get_contents () или $ text. = 'Test'; - PullRequest
14 голосов
/ 15 ноября 2008

Я видел много 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>';
}

Что лучше?

Ответы [ 5 ]

6 голосов
/ 15 ноября 2008

Выходные буферы имеют все подводные камни глобальных переменных. Вы должны знать обо всех путях выполнения от ob_start() до ob_get_clean(). Вы уверены, что он туда попадет, и что любые буферы, открытые между ними, будут закрыты? Имейте в виду, что код может генерировать исключения. Это может быть действительно забавной ошибкой для следующего парня, который выследит.

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

6 голосов
/ 15 ноября 2008

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

Кроме того, вместо запуска ob_get_contents () и ob_clean () просто запустите ob_get_clean (), который выполняет оба одновременно.

4 голосов
/ 15 ноября 2008

Если вы беспокоитесь о накладных расходах на конкатенацию строк, обратите внимание, что это:

echo '

'. $ Test. '
';

заметно медленнее, чем это:

echo '

', $ test, '
';

Первый компилируется до двух конкатов строк, за которыми следует эхо, а второй - до трех эхо, что на самом деле быстрее.

2 голосов
/ 15 ноября 2008

Как упомянуто выше, буферизация вывода лучше для производительности. Для больших строк разница в производительности не является ничтожной. Вы можете сравнить выходную буферизацию в PHP с StringBuffer / StringBuilder в Java; для конкатенации строк необходимо каждый раз копировать всю строку в память. Для буферизации вывода текст помещается в буфер, который увеличивается с заметным приращением, и нет необходимости копировать данные для каждого вывода.

Вы также можете подумать об использовании встроенного HTML (даже быстрее). Дополнительным преимуществом встроенного HTML является то, что ваша IDE может выполнять подсветку синтаксиса HTML, что не произойдет, если HTML находится внутри строки PHP. Модифицированный код (short_open_tags = On обязательно):

ob_start();
?>

<? foreach($items as $item) { ?>
    <div><?= $item ?></div>
<? } ?>

<?
$test = ob_get_clean();
2 голосов
/ 15 ноября 2008

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

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

ob_start();

foreach($items as $item) {
    echo '<div>';
    echo $item;
    echo '</div>';
}

$test = ob_get_clean();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...