我不知道为什么,但这段代码在一个月前对我有用......也许我升级了 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
最佳答案
这是因为脚本终止时正在隐式刷新输出缓冲区。
此时 PHP 已经销毁了未引用的变量,所以当执行回调函数时,变量 $f
在全局范围内不存在。
您可以通过在关闭开始销毁对象之前显式刷新缓冲区来解决此问题,方法是将以下行放在脚本中的某处。
register_shutdown_function('ob_end_flush');
编辑:
我想补充一点,尽管这是目前公认的解释“为什么”的答案,但此处提供的解决方案并未解决问题的根本原因;事实上global
正在使用中。
很多人会告诉你global
是邪恶的,没有给出原因。在这里您可以看到原因之一。
Jack 提供的答案给出了更“最佳实践”的解决方案(使用闭包来维护变量引用),应被视为避免使用 global
的正确方法。在新的代码库中。
关于php - 类对象在 ob_start 回调中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11332122/