0

我目前正在使用输出缓冲来实现某种页眉和页脚自动化。但我需要访问 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,但它只是输出 hello,如果你能提供某种修复,让我可以访问回调函数中的全局变量,而无需先将它们设置为构造函数中的类变量,我将不胜感激。

4

2 回答 2

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";
于 2012-11-16T11:50:29.437 回答
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";
?>
于 2012-11-16T17:46:34.193 回答