Что заставляет __destruct вызываться дважды в таком простом коде PHP? - PullRequest
2 голосов
/ 10 декабря 2011
<?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();

Обычно мы должны получить следующий вывод: (Да. Я получил этот результат на 2 разных серверах с 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(); 

1 Ответ

5 голосов
/ 11 декабря 2011

Наконец-то я нашел причину.

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

Если

zend.ze1_compatibility_mode = On 

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

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

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

Надеюсь, этот ответ будет полезен некоторым парням позже:)

...