我目前正在使用输出缓冲来处理某种类型的标题和放大器。页脚自动化。 但是我需要访问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,但它只输出你好 我真的很感激,如果你能提供一些修复,让我可以访问回调函数中的全局变量,而无需先在构造函数中将它们设置为类变量。
答案 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";
?>