析构方法“__destruct()”的细节说明

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
ini_set('error_reporting', E_ALL);

/**
 * Personal类
 */
class Personal
{
    private string $name;

    /**
     * 构造方法
     */
    public function __construct(string $name)
    {
        $this->name = $name;

        echo "创建【{$this->name}】的个人资料" . PHP_EOL;
    }

    /**
     * 析构方法
     */
    public function __destruct()
    {
        echo "销毁【{$this->name}】的个人资料" . PHP_EOL;
    }
}

$personal1 = new Personal('刘一');
$personal2 = new Personal('陈二');
$personal3 = new Personal('张三');
$personal4 = new Personal('李四');
$personal5 = new Personal('王五');

$personal4 = null; // 重要说明:这里会调用析构方法

unset($personal3); // 重要说明:这里会调用析构方法

$reference = $personal2;
unset($personal2); // 重要说明:这里不会调用析构方法,因为对象还有引用

echo '程序执行到最后辣~~~' . PHP_EOL;


// 输出结果
// --------------------------------------------------
// 创建【刘一】的个人资料
// 创建【陈二】的个人资料
// 创建【张三】的个人资料
// 创建【李四】的个人资料
// 创建【王五】的个人资料
// 销毁【李四】的个人资料
// 销毁【张三】的个人资料
// 程序执行到最后辣~~~
// 销毁【陈二】的个人资料
// 销毁【王五】的个人资料
// 销毁【刘一】的个人资料


//========== 总结 ==========//
// 1、析构方法必须声明为public可见性,否则会报Warning错误。
// 2、析构方法和构造方法一样,不需要声明返回值。
// 3、将对象变量的值设为null或进行unset操作,会自动调用析构方法(前提是对象所有引用都已被删除)。
// 4、当程序执行完脚本最后一行代码会自动调用析构方法,若存在多个对象,那么后创建的对象会先调用析构方法,
//    需要注意的是对象引用会影响调用析构方法的顺序,如上面的“$personal2”因为引用导致其调用析构方法提前了。

Copyright © 2024 码农人生. All Rights Reserved