编程语言
首页 > 编程语言> > 是什么使__destruct在如此简单的PHP代码中被两次调用?

是什么使__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();

正常情况下,我们应该获得以下输出:(是的.我在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(); 

解决方法:

最后我找到了原因.

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

如果

zend.ze1_compatibility_mode = On 

那么执行我在问题中提供的代码时,您会看到两次“ __destruct”.

已在其他版本中报告了此问题:https://bugs.php.net/bug.php?id=29756

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

希望以后这个答案对某些人有用:)

标签:php,destructor
来源: https://codeday.me/bug/20191012/1900231.html