Более конкретно, может ли блок кода
ob_start();
echo $astring;
$astring = ob_get_clean();
изменить значение $ astring? Другими словами, я хочу знать, насколько надежна комбинация эха, буферизации вывода и получения буфера. Конечно, я проверил это. В моих тестах с простыми строками строка остается прежней. Я хочу знать, могу ли я рассчитывать на то, что это всегда так. Есть ли возможное исключение? Что может иметь значение, так это появление в строке специальных escape-символов, и тому подобное.
null
технически не строка, но
<?php
$x=null;
ob_start();
echo $x;
$y=ob_get_clean();
var_dump($x); //NULL
var_dump($y); //string(0) ""
который грубо кастинг null
нанизывать. аналогичные результаты с другими не строковыми типами
Обновить: этот ответ на самом деле не решает проблему ОП. Мы продолжили обсуждение в чате (см. Комментарии к вопросу), и кажется, что ФП был удовлетворен объяснением, которое я дал там, и объяснило их недоумение.
Как я и обещал в комментарии, это кусок кода, который сделает ваш код неудачным. Это искусственно создано для этого обсуждения.
Однако, когда вы работаете над большим проектом, обработчик ошибок может быть установлен где-то в глубоко включенном файле (или в рамках), эффект unset($astring);
это может быть достигнуто опечаткой или простым забыванием сохранить значение в переменной, и окончательный результат будет неожиданным.
// Install an error handler that will output the error messages it gets
set_error_handler(
function($errno, $errstr) {
echo('The error #'.$errno.' happened. The message is: '.$errstr);
return FALSE;
},
E_NOTICE
);
// Ensure the notices won't show to the surface (they will pollute the
// script's output on screen only, they do not change the output buffer)
// You can use error_reporting(0) as well, it still works as expected.
error_reporting(E_ALL & ~E_NOTICE);
// Force PHP trigger an E_NOTICE
// the error handler installed above will kick in and mess the output
unset($astring);// The innocent block of code
ob_start();
echo $astring;
$astring = ob_get_clean();// Check the results
echo("================\n");
echo('The content of variable $astring is: [[['.$astring."]]]\n");
Это вставка и вырезка комментария, сделанного axiac: выходной буфер — не что иное, как скрытая строковая переменная. Он так же надежен, как и любая другая строковая переменная, для хранения любого объема текста, ограниченного конфигурацией memory_limit php.ini (за исключением других данных, создаваемых вашим сценарием, и внутренними структурами PHP для управления памятью) и объемом памяти, доступным на компьютере ( который практически неограничен из-за пейджинга).