PHP:有条件取消析构函数

PHP:有条件取消析构函数,php,destructor,Php,Destructor,我希望一个类的析构函数只执行一次,而不管它在脚本执行期间被调用多少次(一些php版本的javascript) 我有这样一个场景: class A { function __construct() { $b = new B(); // and do some stuff with B if ( condition ) { $c = new C(); // and do some stuff wi

我希望一个类的析构函数只执行一次,而不管它在脚本执行期间被调用多少次(一些php版本的javascript)

我有这样一个场景:

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如果从A调用,可能会触发B的析构函数(因为C扩展了B)。我需要B的最后一个触发器::\u destruct()是唯一的调用方

这是因为B的析构函数设置HTTP响应头,然后传递响应体;如果多次调用析构函数,PHP会出错,因为在主体启动后无法发送头。我处于共享主机状态,因此无法进行配置更改或安装软件包(如PECL)


我知道,因此我可以在B的析构函数的输出中添加一个测试,但我认为这不是最好的解决方案。

析构函数用于在删除实例之前整理实例。无论如何,PHP为您完成了大部分工作,因此它们很少非常有用。如果你需要这个类去做一些事情,不要把它放在析构函数中。我把它放在析构函数中的原因是这样它会在最后被自动调用(这样每个孩子就不必记得调用/执行析构函数的逻辑)。@雅各布:你想在析构函数中做什么?正如Mike已经说过的,析构函数很少有用。@halfdan析构函数发送响应:它设置响应头并输出响应体。@halfdan,强调自动。谢谢,但正如我在问题中提到的,我已经想到了这个解决方案,正在询问另一个解决方案。
function __destruct()
{
  static $runonce=false;
  if($runonce!==false)return;
  $runonce=true;
    echo "B: DESTRUCTOR!\n";
}