首页  >  文章  >  后端开发  >  PHP 中的析构函数

PHP 中的析构函数

WBOY
WBOY原创
2024-08-29 12:42:16476浏览

析构函数是一个函数,用于删除由给定类的构造函数创建的对象实例,作为其功能特性的一部分。每当 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();

输出:

PHP 中的析构函数

示例#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();
?>

输出:

PHP 中的析构函数

示例 #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;
?>

输出:

PHP 中的析构函数

如代码中所述,如果我们取消注释脚本中心的 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();
?>

输出:

PHP 中的析构函数

如果未创建 test_doc.txt,则会抛出以下警告。

PHP 中的析构函数

析构函数的优点

  • 析构函数有助于释放内存分配,从而确保构造函数新创建的对象存在所需的空间,或为任何其他任务释放资源。
  • 确保所有任务高效运行,因为它负责清理过程。
  • 在分配许多变量和结构的情况下,使用析构函数将有助于通过释放内部资源来防止内存泄漏。
  • 它负责静态变量和局部变量。

析构函数的限制

  • 析构函数不能接受任何参数,也不会给出任何返回值(甚至没有 void)。
  • 不允许通过析构函数进行继承
  • 析构函数不一定是静态的
  • 引用析构函数的地址是不可能的
  • 属于包含析构函数的类的对象不允许成为联合体成员。
  • 析构函数必须具有公共访问权限。

结论

正如我们所见,析构函数与构造函数完全相反,用于在对象使用完成后销毁对象,并且在代码中不再需要。从而确保它清理不需要的资源,为未来的资源留出空间。这是通过声明 __destruct() 函数来完成的,PHP 将在脚本末尾自动调用该函数。

以上是PHP 中的析构函数的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
上一篇:Constructor in PHP下一篇:Cookie in PHP