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

この問題は、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 に答える
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 に答える