php - 类对象在 ob_start 回调中不起作用

标签 php

我不知道为什么,但这段代码在一个月前对我有用......也许我升级了 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/

相关文章:

php - 收到错误 fatal error : Call to undefined function mysqli_connect()

php - 不同的结果在 mysql 中

php - 用于汇总分析 cachegrind 文件的工具?

php - 如何在 laravel 中检查今天的日期和时间

php - 如何在 PHP 中使用复选框?

php - 为什么 mysqli_data_seek 不工作?

php - 雅虎老板 - 链接 - 困惑!

php - 无法在 MySQL、PHP、AngularJS 中插入多行

javascript - javascript打印后获取页面内容

php - 如何在 PHP 中发送新 header 以下载 Excel 中的 MySQL 表条目?