Php 如果我回显一个带有输出缓冲区的字符串并获取缓冲区,我是否总是返回原始字符串?

Php 如果我回显一个带有输出缓冲区的字符串并获取缓冲区,我是否总是返回原始字符串?,php,echo,output-buffering,Php,Echo,Output Buffering,更具体地说,可以使用代码块 ob_start(); echo $astring; $astring = ob_get_clean(); 更改$astring的值?换句话说,我想知道回声、输出缓冲和获取缓冲的组合有多可靠。当然,我已经测试过了。对于简单字符串,在我的测试中,字符串保持不变。我想知道我是否可以相信这种情况会一直持续下去。有可能的例外吗?区别在于字符串中出现了特殊的转义字符,诸如此类。更新:这个答案实际上并没有解决OP的问题。我们在聊天中继续讨论,看看对这个问题的评论,OP似乎对

更具体地说,可以使用代码块

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结构以及计算机上由于分页而几乎不受限制的可用内存量来限制

简单的答案是试试看。@RiggsFolly,当然,我这样做了,在我的测试中也是一样的,但这并不意味着没有其他不同的情况。无论如何,最初,我有一个关于更复杂设置的更复杂的问题,我把它简化为这个更简单的问题。我可以把它简化成更简单的。ob_是否启动;回音:阿斯汀$astring=ob_get_clean;可以更改$astring的值吗?我想答案是否定的。如果我用一个简单的字符串进行测试,它不会改变字符串。在任何情况下都是这样吗?我将编辑这个问题。这是一个简单的答案,但我想要一个权威的答案。如果你想要一个权威的答案,那么你必须在另一个网站上提问。也许是在。或者看看PHPs的源代码,它就在上面。或者阅读关于和的PHP手册页面,得出自己的结论。当然,也有例外。这取决于你在ob_start和ob_get_clean之间做了什么,以及其他因素,我将尝试构建一个脚本来展示这一点;在ob_get_clean之前插入的将清理输出缓冲区,并让ob_get_clean在不返回任何内容的情况下返回空字符串。在变量$astring被取消设置后,它将不再是字符串。它只是一个未定义的变量。这个问题是关于字符串的。这是问题的一个重要方面。我想知道这三行的代码块是否为字符串定义了可靠的通道。如果您确定$astring在ob_开始之前是字符串,并且您只在ob_清除之前回显它,我想您将始终得到它。但是,如果你做了一些事情,比如把它传递给一个处理更复杂的函数,那么总有可能出现一些问题,你会得到一些其他的东西。你这样做有什么好的理由吗?我的意思是,既然您的文本已经在$astring中,为什么要这样做呢?没有任何外部干预,没有自定义错误处理程序,什么都没有,如果$astring是一个数组,在您执行此技巧后,您将得到字符串“Array”。这与$astring之前的内容并不相同。是的,但数组也不是字符串。如果有人愿意根据自己的经验确认,在字符串不为null、不为数组等情况下,字符串将保持不变,那么我将接受答案。因为所有查找异常的尝试都使用非字符串,也许答案确实是,在缓冲区中回显字符串并将其取回不会改变它。这并不明显,因为缓冲区最初并不打算成为可靠的存储设备。在通过HTTP发送字符串之前,我们有时需要对字符串进行编码。缓冲区也有类似的要求。输出缓冲区只是一个隐藏的字符串变量。与任何其他字符串变量一样,它可以可靠地保存任意数量的文本,这些文本由memory_limit php.ini配置减去脚本创建的其他数据、用于内存管理的内部php结构以及计算机上由于分页而几乎无限制的可用内存量来限制。好的,这就是答案。我怎么接受呢?以前,我有一个阴道
缓冲区的e视图,一个未指定的对象,对于所有字符串来说都不一定可靠。这可能看起来很明显,但对我来说不是。毕竟,为什么在我们实际输出字符串之前使用输出缓冲区来处理它。在我看来,在回答这个问题之前,如果它是一个输出缓冲区,那么就不需要对它进行操作,如果您检索它进行操作,那么结果可能是不可预测的。换句话说,我觉得ob_start等是我们不应该使用的工具,除非在特殊情况下。也许这将有助于我对ob_start有同样错误理解的其他人,等等。