如果我用输出缓冲回显一个字符串并获取缓冲区,我是否总能取回原始字符串?

If I echo a string with output-buffering and get the buffer, will I always get back the original string?

更具体地说,代码块

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

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

更新:这个答案实际上并没有解决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");

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

<?php
$x=null;

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

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

粗略地将 null 转换为字符串。与其他非字符串类型类似的结果

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