PHP:有条件地取消析构函数

时间:2014-01-20 01:10:10

标签: php destructor

我想让一个类的析构函数只执行一次,无论在执行脚本期间调用了多少次(某些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的析构函数中添加一个测试输出,但我不认为这是最好的解决方案。

1 个答案:

答案 0 :(得分:0)

function __destruct()
{
  static $runonce=false;
  if($runonce!==false)return;
  $runonce=true;
    echo "B: DESTRUCTOR!\n";
}