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