Подтвердить что ты не робот

Ob_get_contents + ob_end_clean vs ob_get_clean

Есть ли разница между этими двумя частями PHP?

ob_start();
//code...
$pageContent = ob_get_contents();
ob_end_clean();
someFunction($pageContent);

против

ob_start();
//code...
$pageContent=ob_get_clean();
someFunction($pageContent);

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

4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос:

ob_get_clean() выполняет по существу как ob_get_contents(), так и ob_end_clean().

Да. Это функционально эквивалентно.


Случай 1:

ob_get_contents() + ob_end_clean():

ob_get_contents - вернуть содержимое выходного буфера

ob_end_clean - очистить (стереть) выходной буфер и отключить буферизацию вывода

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

Случай 2:

ob_get_clean - Получить текущее содержимое буфера и удалить текущий выходной буфер

Вы сохраняете содержимое буфера в переменной, а затем удаляете выходной буфер.


То, что вы делаете, по сути то же самое. Итак, я не вижу ничего плохого в использовании второго блока кода здесь, так как они оба делают то же самое.

Ответ 2

ob_get_contents() можно использовать для продолжения буферизации вывода.

Пример:

ob_start();
echo 'Something!';
$html1 = ob_get_contents();
echo 'More to say!';
$html2 = ob_get_contents();
ob_end_clean();

В конце у vars есть это содержимое:

$html1 = 'Something!';
$html2 = 'Something!More to say!';

Ответ 3

Существует одна маленькая разница между

$stuff = ob_get_clean();

и

$stuff = ob_get_contents();
ob_end_clean();

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

То, что два подхода в значительной степени эквивалентны, явно документировано на php.net, в котором говорится:

ob_get_clean() по существу выполняет как ob_get_contents(), так и ob_end_clean().

Поведение предупреждения ob_end_clean также документировано:

Если функция не работает, она генерирует E_NOTICE.

Обратите внимание, что в документах ob_get_contents или ob_end_clean.

Если вы действительно хотите заверить себя, нет никаких дополнительных различий между этими функциями (их нет), вы можете погрузиться в определения ob_get_contents, ob_end_clean и ob_get_clean в источнике. Там какая-то странная обработка ошибок для невозможных случаев в ob_get_clean, которая никогда не должна достигаться, но кроме того, вы можете видеть, что поведение такое, как описано.

Ответ 4

Функция

ob_get_clean() выполняет как ob_get_contents(), так и ob_end_clean().

Такая же функциональность, как ob_get_contents() + ob_end_clean(), ob_get_clean() возвращает содержимое буфера вывода и завершения вывода. Если буферизация вывода не активна, возвращается FALSE.