PHP 中的析构函数
析构函数是一个函数,用于删除由给定类的构造函数创建的对象实例,作为其功能特性的一部分。每当 PHP 程序中使用构造函数时,并不强制需要使用析构函数来补充其功能。但在需要构造函数的程序中使用析构函数被认为是一种很好的做法。此外,该方法并不是专门调用执行的,而是在控件找不到对构造函数方法的函数引用时执行。
调用析构函数的基本语法:__destruct() 函数,
广告 该类别中的热门课程 PHP 开发人员 - 专业化 | 8 门课程系列 | 3次模拟测试开始您的免费软件开发课程
网络开发、编程语言、软件测试及其他
语法:
__destruct ( void ) : void
对于每个要调用的析构函数,其前面必须有一个构造函数,如下所示:
<?php class <ANY_CLASS_NAME> { // Declaring a constructor function __construct() { // To initialize required properties } // Declaring a destructor function __destruct() { // To remove reference of an object } } ?>
PHP 中析构函数的工作
析构函数基本上由垃圾收集器管理,当不再需要对象时它会清除该对象。与构造函数相比,它不能接受任何参数作为输入。
此方法还用于清理资源并释放内存以容纳更多内存。不能使用析构函数执行重载,并且同一类中只能存在单个析构函数。它的另一个独特功能是,即使脚本在 exit() 命令的帮助下停止执行,析构函数仍然会被调用。此 exit() 将不允许剩余的关闭方法退出。
PHP 中的析构函数示例
让我们举一些例子来更好地理解析构函数:
示例#1
这是一个简单的示例,我们创建一个基本的构造函数,然后通过调用析构函数来销毁它。
代码:
<?php class DestructableExample { function __construct() { print "Inside constructor\n"; } function __destruct() { print "Destroying the class " . __CLASS__ . "\n"; } } $obj = new DestructableExample();
输出:
示例#2
在这个例子中,我们在构造函数中使用了两个变量;员工的名字和姓氏,然后我们在 PHP 代码结束之前通过调用析构函数来销毁对象 Employee。
代码:
<?php class Employee { // Employee's first name private $emp_fname; // Employee's last name private $emp_lname; // Declaration of constructor public function __construct($emp_fname, $emp_lname) { echo "Initialisation of object as follows...<br/>"; $this->emp_fname = $emp_fname; $this->emp_lname = $emp_lname; } // Declaration of destructor public function __destruct(){ // Here we can clean the resources echo "Removing the Object..."; } // This method is being used to display full name public function showName() { echo "Employee full name is: " . $this->emp_fname . " " . $this->emp_lname . "<br/>"; } } // Class object declaration $harry = new Employee("Harry", "Potter"); $harry->showName(); ?>
输出:
示例 #3
在此示例中,我们将了解如何处理文件 test_doc.txt,该文件是与主文件位于同一工作目录中的必备文本文档。确保在 test_doc.txt 中包含一些需要作为代码的一部分显示的文本。
fopen是用于打开文件的内置函数,fread是用于读取文件内容的函数。这里将调用析构函数来关闭/销毁文件句柄。
代码:
<?php header("Content-type: text/plain"); class Example { /** * Declaring an identifier * variable- string */ private $first_name; /** * A reference to another Foo object * variable Foo */ private $setlink; public function __construct($first_name) { $this->first_name = $first_name; } public function setLink(Example $setlink){ $this->setlink = $setlink; } public function __destruct() { echo 'Destroying: ', $this->first_name, PHP_EOL; } } // We are creating 2 objects here $obj1 = new Example('Example 1'); $obj2 = new Example('Example 2'); // Objects are made to point to themselves $obj1->setLink($obj1); $obj2->setLink($obj2); // Destroying their global references $obj1 = null; $obj2 = null; // Since both objects are declared null we cannot access them now and hence they must be destroyed // but since they are not yet destroyed a memory leak may occur as they are still present. // // Garbage collector can be called as shown in below line. Uncomment to check its functionality // gc_collect_cycles(); // Now we create 2 more objects but will not set their references // only the obj1 and obj2 are pointing to them right now $obj1 = new Example('Example 3'); $obj2 = new Example('Example 4'); // Removing their global references $obj1 = null; $obj2 = null; // Now the Example 3 and example 4 cannot be accessed due to no references // for them. Hence the destructor is called automatically // previous to the execution of next line echo 'Script has ended', PHP_EOL; ?>
输出:
如代码中所述,如果我们取消注释脚本中心的 gc_collect_cycles() 函数,我们将得到如下输出:
示例#4
代码:
<?php class FileHandle{ private $file_handle; private $name; /** * We declare file handle with parameters file name and mode * Using parameter string $name as file name * Using parameter string $fmode as file mode for read, write */ public function __construct($name,$fmode){ $this->name = $name; $this->file_handle = fopen($name, $fmode); } /** * We are closing the file handle */ public function __destruct(){ if($this->file_handle){ fclose($this->file_handle); } } /** * Reading and printing file's content */ public function display(){ echo fread($this->file_handle, filesize($this->name)); } } $fu = new FileHandle('./test_doc.txt', 'r'); $fu->display(); ?>
输出:
如果未创建 test_doc.txt,则会抛出以下警告。
析构函数的优点
- 析构函数有助于释放内存分配,从而确保构造函数新创建的对象存在所需的空间,或为任何其他任务释放资源。
- 确保所有任务高效运行,因为它负责清理过程。
- 在分配许多变量和结构的情况下,使用析构函数将有助于通过释放内部资源来防止内存泄漏。
- 它负责静态变量和局部变量。
析构函数的限制
- 析构函数不能接受任何参数,也不会给出任何返回值(甚至没有 void)。
- 不允许通过析构函数进行继承
- 析构函数不一定是静态的
- 引用析构函数的地址是不可能的
- 属于包含析构函数的类的对象不允许成为联合体成员。
- 析构函数必须具有公共访问权限。
结论
正如我们所见,析构函数与构造函数完全相反,用于在对象使用完成后销毁对象,并且在代码中不再需要。从而确保它清理不需要的资源,为未来的资源留出空间。这是通过声明 __destruct() 函数来完成的,PHP 将在脚本末尾自动调用该函数。
以上是PHP 中的析构函数的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。
