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);
В настоящее время я использую первый блок, но я бы предпочел использовать второй, если он функционально эквивалентен, поскольку он немного более краток.
Ответы
Ответ 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.