是什么让_destruct在如此简单的PHP代码中调用了两次?

是什么让_destruct在如此简单的PHP代码中调用了两次?,php,destructor,Php,Destructor,但是,在CentOS 5.7版和PHP 5.2.17版的另一台服务器上,我得到了以下信息: __construct array(1) { [0]=> array(5) { ["function"]=> string(10) "__destruct" ["class"]=> string(1) "A" ["object"]=> object(A)#1 (0) { } ["type"]=>

但是,在CentOS 5.7版和PHP 5.2.17版的另一台服务器上,我得到了以下信息:

__construct
array(1) {
  [0]=>
  array(5) {
    ["function"]=>
    string(10) "__destruct"
    ["class"]=>
    string(1) "A"
    ["object"]=>
    object(A)#1 (0) {
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(0) {
    }
  }
}
__destruct
为什么函数_在这里被调用了两次?尤其是第一次

我认为配置中可能有一些特殊之处,有什么建议吗

谢谢

==================

PS:这个问题不是由“单例设计模式”引起的。以下代码出现了相同的问题:

    __construct
    array(2) {
      [0]=>
      array(7) {
        ["file"]=>
        string(10) "/tmp/1.php"
        ["line"]=>
        int(7)
        ["function"]=>
        string(10) "__destruct"
        ["class"]=>
        string(1) "A"
        ["object"]=>
        object(A)#1 (0) {
        }
        ["type"]=>
        string(2) "->"
        ["args"]=>
        array(0) {
        }
      }
      [1]=>
      array(6) {
        ["file"]=>
        string(10) "/tmp/1.php"
        ["line"]=>
        int(21)
        ["function"]=>
        string(4) "Init"
        ["class"]=>
        string(1) "A"
        ["type"]=>
        string(2) "::"
        ["args"]=>
        array(0) {
        }
      }
    __destruct
    array(1) {
      [0]=>
      array(5) {
        ["function"]=>
        string(10) "__destruct"
        ["class"]=>
        string(1) "A"
        ["object"]=>
        object(A)#2 (0) {
        }
        ["type"]=>
        string(2) "->"
        ["args"]=>
        array(0) {
        }
      }
    }
    __destruct

我终于找到了原因

这可能是PHP 5.2.x中的错误:

如果

然后,当执行我在问题中提供的代码时,您可以看到两次“u destruct”

此问题已在其他版本中报告:

在我的测试中不影响PHP5.3。(PHP 5.3删除了此设置)


希望这个答案以后对一些人有所帮助:)

@vascowhite:我觉得这不是一个完全相同的答案。只知道PHP的人可能不理解C++中的例子。虽然答案可能有些相似,但目标受众却大不相同。也许它与垃圾收集器有关?仅供参考,mac上的PHP5.2.17此代码只触发一次_destruct。mac上的PHP5.3.5也能正常工作。您确定所有服务器上的代码都相同吗?@TimG感谢您的测试和回复。如果在php.ini中打开设置zend.ze1_compatibility_mode=on,则可以在结果中找到两次析构函数。这可能是一个错误,请看我的答案。
    __construct
    array(2) {
      [0]=>
      array(7) {
        ["file"]=>
        string(10) "/tmp/1.php"
        ["line"]=>
        int(7)
        ["function"]=>
        string(10) "__destruct"
        ["class"]=>
        string(1) "A"
        ["object"]=>
        object(A)#1 (0) {
        }
        ["type"]=>
        string(2) "->"
        ["args"]=>
        array(0) {
        }
      }
      [1]=>
      array(6) {
        ["file"]=>
        string(10) "/tmp/1.php"
        ["line"]=>
        int(21)
        ["function"]=>
        string(4) "Init"
        ["class"]=>
        string(1) "A"
        ["type"]=>
        string(2) "::"
        ["args"]=>
        array(0) {
        }
      }
    __destruct
    array(1) {
      [0]=>
      array(5) {
        ["function"]=>
        string(10) "__destruct"
        ["class"]=>
        string(1) "A"
        ["object"]=>
        object(A)#2 (0) {
        }
        ["type"]=>
        string(2) "->"
        ["args"]=>
        array(0) {
        }
      }
    }
    __destruct
<?php
class A
{
    function __construct()
    {   
        echo "__construct\n";
    }

    function __destruct()
    {
        var_dump(debug_backtrace());
        echo "__destruct\n";
    }
}
$a = new A(); 
zend.ze1_compatibility_mode = On