加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:38:16 所属栏目: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=s
我不知道为什么,但这个代码在一个月前为我工作,也许我升级了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’);

编辑:

我想补充一点,即使这是现在接受的解释“为什么”的答案,这里提供的解决方案并没有解决问题的根本原因.全球正在被使用的事实.

许多人会告诉你,全球是邪恶的,没有给出理由.在这里你可以看到原因之一.

杰克提供的答案给出了更多的“最佳实践”解决方案(使用闭包来维护变量引用),并且应该被认为是避免在新的代码库中使用全局的正确方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读