如果我用输出缓冲回显一个字符串并获取缓冲区,我是否总能取回原始字符串?
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 结构)以及计算机上可用的内存量(由于分页,实际上是无限的)。
更具体地说,代码块
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 结构)以及计算机上可用的内存量(由于分页,实际上是无限的)。