我想让一个类的析构函数只执行一次,无论在执行脚本期间调用了多少次(某些php版本的javascript event.stopPropagation())。
我有这样的场景:
class A
{
function __construct()
{
$b = new B(); // and do some stuff with B
if ( condition )
{
$c = new C(); // and do some stuff with C
}
}
}
class B
{
function __destruct()
{
echo "B: DESTRUCTOR!\n";
}
// …
}
class C extends B
{
function __construct()
{
echo "C: CONSTRUCTOR!\n";
}
public function i()
{
echo "C->i()\n";
}
}
$a = new A();
A 正在触发 B 的析构函数(因为它会创建B的实例),而 C 可能会触发 B < / strong>的析构函数(因为C扩展B)如果从A调用它。我需要B :: __ destruct()的最后一个触发器成为唯一的调用者。
这是因为B的析构函数设置了HTTP Response头,然后传递了响应体;如果多次调用析构函数,则PHP错误输出,因为在主体启动后无法发送标头。我处于共享主机状态,因此无法进行配置更改或安装包(如PECL的HttpResponse
)。
我知道headers_sent()
,所以我可以在B的析构函数中添加一个测试输出,但我不认为这是最好的解决方案。
答案 0 :(得分:0)
function __destruct()
{
static $runonce=false;
if($runonce!==false)return;
$runonce=true;
echo "B: DESTRUCTOR!\n";
}