ob_start output_callback无法访问全局变量

时间:2012-11-16 11:46:25

标签: php output-buffering

我目前正在使用输出缓冲来处理某种类型的标题和放大器。页脚自动化。 但是我需要访问output_callback函数中的全局变量。 如果我不使用面向类的代码,则没有任何问题。 但是,如果我尝试类似的东西:

class AnotherClass{
    public $world = "world";
}

$anotherClass = new AnotherClass();

class TestClass{
    function __construct(){
        ob_start(array($this,"callback"));
    }

    function callback($input){
        global $anotherClass;
        return $input.$anotherClass->world;
    }
}

$tClass = new TestClass();

echo "hello";

虽然预期的输出是helloworld,但它只输出你好 我真的很感激,如果你能提供一些修复,让我可以访问回调函数中的全局变量,而无需先在构造函数中将它们设置为类变量。

2 个答案:

答案 0 :(得分:0)

ob_start出现错误。回调应如下所示:array($this, 'callback')如下:

<?php

$x="world";

class testClass{
    function __construct(){
        ob_start(array($this,"callback"));
    }

    function callback($input){
        global $x;
        return $input.$x;
    }
}

$tClass = new testClass();

echo "hello";

更改问题后的其他内容

php的输出缓冲有点奇怪,似乎是在另一块堆栈或其他东西上。您可以通过将对变量的新引用直接引入闭包来解决此问题:

<?php

class AnotherClass{
    public $world = "world";
    public function __destruct()
    {
        // this would display in between "hello" and "world"
        // echo "\n".'destroying ' . get_called_class() . "\n";
    }
}

class TestClass
{
    function __construct()
    {
        global $anotherClass;

        // taking a new reference into the Closure
        $myReference = $anotherClass;
        ob_start(function($input) use (&$myReference) {
            return $input . $myReference->world;
        });
    }
}

// the order here is important
$anotherClass = new AnotherClass();
$tClass = new TestClass();

echo "hello";

答案 1 :(得分:0)

出现问题是因为在执行output_callback之前,没有引用的对象被破坏。 因此,您可以通过添加对要保存的对象的引用来解决问题。

修复示例:

<?php
class AnotherClass{
    public $world = "world";
}

$anotherClass = new AnotherClass();

class TestClass{
    private $globals;

    function __construct(){
        global $anotherClass;
        $this->globals[]=&$anotherClass;
        ob_start(array($this,"callback"));
    }

    function callback($input){
        global $anotherClass;
        return $input.$anotherClass->world;
    }
}

$tClass = new TestClass();

echo "hello";
?>