gpt4 book ai didi

php 析构函数行为

转载 作者:可可西里 更新时间:2023-10-31 22:40:28 25 4
gpt4 key购买 nike

我正在尝试了解 php 构造函数和析构函数的行为。构造函数的一切都按预期进行,但我无法让析构函数隐式触发。我已经阅读了 php.net 和相关网站上的所有内容,但找不到这个问题的答案。

如果我有一个简单的类,比如:

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

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

关于php 析构函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com