<?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 удалил этот параметр)
Надеюсь, этот ответ будет полезен для некоторых парней позже 🙂