Если я выведу строку с буферизацией вывода и получу буфер, всегда ли я вернусь к исходной строке?

Более конкретно, может ли блок кода

ob_start();
echo $astring;
$astring = ob_get_clean();

изменить значение $ astring? Другими словами, я хочу знать, насколько надежна комбинация эха, буферизации вывода и получения буфера. Конечно, я проверил это. В моих тестах с простыми строками строка остается прежней. Я хочу знать, могу ли я рассчитывать на то, что это всегда так. Есть ли возможное исключение? Что может иметь значение, так это появление в строке специальных escape-символов, и тому подобное.

0

Решение

null технически не строка, но

<?php
$x=null;

ob_start();
echo $x;
$y=ob_get_clean();

var_dump($x); //NULL
var_dump($y); //string(0) ""

который грубо кастинг null нанизывать. аналогичные результаты с другими не строковыми типами

0

Другие решения

Обновить: этот ответ на самом деле не решает проблему ОП. Мы продолжили обсуждение в чате (см. Комментарии к вопросу), и кажется, что ФП был удовлетворен объяснением, которое я дал там, и объяснило их недоумение.


Как я и обещал в комментарии, это кусок кода, который сделает ваш код неудачным. Это искусственно создано для этого обсуждения.

Однако, когда вы работаете над большим проектом, обработчик ошибок может быть установлен где-то в глубоко включенном файле (или в рамках), эффект 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");
0

Это вставка и вырезка комментария, сделанного axiac: выходной буфер — не что иное, как скрытая строковая переменная. Он так же надежен, как и любая другая строковая переменная, для хранения любого объема текста, ограниченного конфигурацией memory_limit php.ini (за исключением других данных, создаваемых вашим сценарием, и внутренними структурами PHP для управления памятью) и объемом памяти, доступным на компьютере ( который практически неограничен из-за пейджинга).

0
По вопросам рекламы [email protected]