即时通讯试图了解php构造函数和析构函数的行为。一切都按预期进行,但我在使析构函数隐式启动时遇到了麻烦。我已经在php.net和相关站点上完成了所有阅读,但是我找不到这个问题的答案。

如果我有一个简单的类(class),则类似:

class test{

     public function __construct(){
          print "contructing<br>";
     }

     public function __destruct(){
          print "destroying<br>";
     }
}

我用类似这样的名称来称呼它:
$t = new test;

它输出构造函数消息。但是,我希望当脚本结束并呈现页面时,应该触发析构函数。当然没有。

如果我在脚本结束时调用unset($t);,则析构函数当然会触发,但是有没有办法让它隐式触发?

最佳答案

这很容易测试。

<?php

class DestructTestDummy {
    protected $name;

    function __construct($name) {
        echo "Constructing $name\n";
        $this->name = $name;
    }

    function __destruct() {
        echo "Destructing $this->name\n";
        //exit;
    }
}

echo "Start script\n";

register_shutdown_function(function() {
    echo "Shutdown function\n";
    //exit
});

$a = new DestructTestDummy("Mr. Unset");
$b = new DestructTestDummy("Terminator 1");
$c = new DestructTestDummy("Terminator 2");

echo "Before unset\n";
unset($a);
echo "After unset\n";


echo "Before func\n";
call_user_func(function() {
    $c = new DestructTestDummy("Mrs. Scopee");
});
echo "After func\n";

$b->__destruct();

exit("Exiting\n");

在PHP 5.5.12中,输出如下:
Start script
Constructing Mr. Unset
Constructing Terminator 1
Constructing Terminator 2
Before unset
Destructing Mr. Unset
After unset
Before func
Constructing Mrs. Scopee
Destructing Mrs. Scopee
After func
Destructing Terminator 1
Exiting
Shutdown function
Destructing Terminator 2
Destructing Terminator 1

因此,我们可以看到,当我们显式取消设置对象,超出范围以及脚本结束时,将调用析构函数。

10-07 19:11