我不知道为什么,但这个代码在一个月前为我工作,也许我升级了PHP,但不记得了.尝试使用
PHP 5.2.17和5.3.6
为什么不能在ob_start函数的回调中使用类对象?
<?PHP $f=new stdClass(); $f->title="awesome Title"; function callback($buffer) { global $f; $buffer=str_replace("###TITLE###",$f->title,$buffer); return $buffer; } ob_start("callback"); ?> This is the ###TITLE###
输出为:
PHP Notice: Trying to get property of non-object in /Users/qxxx/Sites/test/test.PHP on line 8 This is the
应该:
This is the awesome Title
这是因为输出缓冲区被脚本的终止隐式刷新.
原文链接:https://www.f2er.com/php/131842.html此时,PHP已经破坏了未引用的变量,因此在执行回调函数时,变量$f不存在于全局范围中.
您可以通过在关闭开始销毁对象之前通过显式刷新缓冲区来解决此问题,方法是在脚本中放置以下行.
register_shutdown_function( ‘ob_end_flush’);
编辑:
我想补充一点,即使这是现在接受的解释“为什么”的答案,这里提供的解决方案并没有解决问题的根本原因.全球正在被使用的事实.
许多人会告诉你,全球是邪恶的,没有给出理由.在这里你可以看到原因之一.
杰克提供的答案给出了更多的“最佳实践”解决方案(使用闭包来维护变量引用),并且应该被认为是避免在新的代码库中使用全局的正确方法.