如果我使用output-buffering回显一个字符串并获取缓冲区,我是否总能找回原始字符串?

时间:2015-01-14 10:18:32

标签: php echo output-buffering

更具体地说,可以代码块

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

更改$ astring的值?换句话说,我想知道echo,输出缓冲和获取缓冲区的组合是多么可靠。当然,我已经测试过了。使用简单的字符串,在我的测试中,字符串保持不变。我想知道我是否可以依靠这种情况。有没有可能的例外?可能有所不同的是字符串中特殊转义字符的出现,类似的事情。

3 个答案:

答案 0 :(得分:0)

更新:此答案实际上并未解决OP的问题。我们在聊天中继续讨论(参见有关问题的评论),看来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");

答案 1 :(得分:0)

null技术上不是字符串,而是

<?php
$x=null;

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

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

大致是将null强制转换为字符串。与其他非字符串类型类似的结果

答案 2 :(得分:0)

这是由axiac做出的评论的粘贴和剪切:输出缓冲区只不过是一个隐藏的字符串变量。它与任何其他字符串变量一样可靠,可以容纳任何数量的文本,受memory_limit php.ini配置的限制(减去脚本创建的其他数据和内存管理的内部PHP结构)以及计算机上可用的内存量(由于分页,这几乎是无限的。