Что делает __destruct дважды вызываемым в таком простом PHP-коде?

<?php class A { static private $_instance = null; static public function Init() { self::$_instance = new A(); } function __construct() { echo "__construct\n"; } function __destruct() { var_dump(debug_backtrace()); echo "__destruct\n"; } } $a = A::Init(); 

Как правило, мы должны получить следующий результат: (Да, я получил этот результат на двух разных серверах с PHP 5.2.10-2ubuntu6.10 и PHP 5.3.1)

 __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 

Но на другом сервере с выпуском CentOS 5.7 и PHP 5.2.17 я получил следующее:

  __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 

Почему функция __destruct называется здесь дважды? Особенно в первый раз.

Я думаю, что может быть что-то особенное в конфигурации, любое предложение?

Благодарю.

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

PS: Эта проблема не вызвана «шаблоном проектирования Singleton». Такая же проблема появилась со следующим кодом:

 <?php class A { function __construct() { echo "__construct\n"; } function __destruct() { var_dump(debug_backtrace()); echo "__destruct\n"; } } $a = new A(); 

Наконец, я нахожу причину.

Это может быть ошибка в PHP 5.2.x:

Если

 zend.ze1_compatibility_mode = On 

то вы можете увидеть «__destruct» дважды, когда выполняете код, который я предоставляю в своем вопросе.

Об этой проблеме сообщалось в других версиях: https://bugs.php.net/bug.php?id=29756

Не влияйте на PHP 5.3 в моем тесте. (PHP 5.3 удалил этот параметр)

Надеюсь, этот ответ будет полезен для некоторых парней позже 🙂