析构函数是一个函数,用于删除由给定类的构造函数创建的对象实例,作为其功能特性的一部分。每当 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 } } ?>
析构函数基本上由垃圾收集器管理,当不再需要对象时它会清除该对象。与构造函数相比,它不能接受任何参数作为输入。
此方法还用于清理资源并释放内存以容纳更多内存。不能使用析构函数执行重载,并且同一类中只能存在单个析构函数。它的另一个独特功能是,即使脚本在 exit() 命令的帮助下停止执行,析构函数仍然会被调用。此 exit() 将不允许剩余的关闭方法退出。
让我们举一些例子来更好地理解析构函数:
这是一个简单的示例,我们创建一个基本的构造函数,然后通过调用析构函数来销毁它。
代码:
<?php class DestructableExample { function __construct() { print "Inside constructor\n"; } function __destruct() { print "Destroying the class " . __CLASS__ . "\n"; } } $obj = new DestructableExample();
输出:
在这个例子中,我们在构造函数中使用了两个变量;员工的名字和姓氏,然后我们在 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(); ?>
输出:
在此示例中,我们将了解如何处理文件 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() 函数,我们将得到如下输出:
代码:
<?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,则会抛出以下警告。
正如我们所见,析构函数与构造函数完全相反,用于在对象使用完成后销毁对象,并且在代码中不再需要。从而确保它清理不需要的资源,为未来的资源留出空间。这是通过声明 __destruct() 函数来完成的,PHP 将在脚本末尾自动调用该函数。
以上是PHP 中的析构函数的详细内容。更多信息请关注PHP中文网其他相关文章!