2015-01-14 8 views
0

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

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

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

+2

Простой ответ: ПОПРОБУЙТЕ ЭТО И ВИДЕТЬ. – RiggsFolly

+0

@RiggsFolly, конечно, я сделал это, и в моих тестах это одно и то же, но это не означает, что нет других обстоятельств, когда это будет иначе. –

+0

В любом случае, изначально у меня был более сложный вопрос об более сложной настройке, и я сводил ее к этой более простой. Я мог бы уменьшить его до еще более простого. Использует ли ob_start(); echo $ astring; $ astring = ob_get_clean(); 'может изменить значение $ astring? Я думаю, что ответ отрицательный. Если я тестирую простую строку, это не изменит строку. Это правда во всех обстоятельствах? Я отредактирую вопрос. Это простой, но я хочу получить авторитетный ответ. –

ответ

0

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

+0

Это может показаться очевидным, но для меня это не так.В конце концов, почему «выходной буфер» используется для управления строкой, прежде чем мы ее выведем. На мой взгляд, перед этим ответом, если это выходной буфер, тогда его нельзя манипулировать и, если вы его извлечете для манипуляции, результат может быть непредсказуемым. Другими словами, я чувствовал, что ob_start() и т. Д. - это инструменты, которые мы не должны использовать, за исключением особых случаев. Возможно, это поможет другим, что у меня такое же неправильное понимание ob_start() и т. Д. –

0

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


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

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

Ну, после того, как переменная $ astring была отключена, это уже не строка. Это просто неопределенная переменная. Вопрос задает строку. Это важный аспект вопроса. Я хочу знать, определяет ли блок кода (три строки) надежный канал для строки. –

+0

Если вы уверены, что '$ astring' является строкой перед' ob_start() ', и вы только' echo() 'it перед' ob_get_clean() 'Я думаю, вы всегда получите его обратно. Но если вы делаете что-то вроде передачи его функции, которая выполняет более сложную обработку, всегда есть шанс, что что-то пойдет не так, и вы получите что-то еще. Есть ли веская причина, что вы делаете этот трюк? Я имею в виду, поскольку у вас уже есть свой текст в '$ astring', почему вы это сделаете? – axiac

+0

Без какого-либо внешнего вмешательства никакой пользовательский обработчик ошибок, ничего, если '$ astring' является' Array' после того, как вы сделаете этот трюк, вместо этого вы получите строку '' Array''. И это не равнозначно предыдущему содержанию '$ astring' любым способом. – axiac

0

null технически не является строкой, но

<?php 
$x=null; 

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

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

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

+0

Поскольку все попытки найти исключение используют не строки, возможно, ответ действительно заключается в том, что повторение строки в буфере и возврат ее не изменят ее. Это не очевидно, потому что буфер изначально не предназначен для надежного устройства хранения. Нам нужно кодировать строки иногда, прежде чем отправлять их через HTTP. Некоторые аналогичные требования могут быть сохранены для буфера. –

+0

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

+0

Хорошо, это ответ. Как я могу принять его? Раньше у меня было это неопределенное представление о буфере, неуказанном объекте, который не всегда был надежным для всех строк. –