析构函数的作用和构造函数正好相反,析构函数只有在对象被垃圾收集器收集前(即对象从内存中删除之前)才会被自动调用。析构函数允许我们在销毁一个对象之前执行一些特定的操作,例如关闭文件、释放结果集等。
在 PHP 中有一种垃圾回收机制,当对象不能被访问时就会自动启动垃圾回收机制,收回对象占用的内存空间。而析构函数正是在垃圾回收机制回收对象之前调用的。
析构函数的声明格式与构造函数相似,在类中声明析构函数的名称也是固定的,同样以两个下画线开头的方法名__destruct(),而且析构函数不能带有任何参数。在类中声明析构方法的格式如下:
public function __destruct(){
... ...
}
说明:
某个对象的所有引用被删除:
1、使用unset(对象名),将对象名销毁
2、$对象名 = null
3、$对象名 = 'abc'
显式销毁:
上面写的三种方式,都是显式销毁,所谓显式销毁就是程序员主动删除对象引用。
隐式销毁:
如果程序员不去显式销毁对象,那么在程序执行完毕后,这个对象就会被系统销毁,这个就是系统销毁。也叫隐式销毁。
注意:
(1)析构函数访问修饰符都是public
(2)析构函数没有形参
(3)析构函数是系统调用的(系统会自动调用,不需要程序员手工调用)
(4)析构函数在如下情况会被系统调用
1、php文件执行完,退出前
2、在某个对象的所有引用都被删除或者当对象被显式销毁时执行。(即成为了垃圾对象)
①.所谓垃圾对象,就是指没有任何变量再引用它
②.一旦一个对象成为垃圾对象,析构函数就会立即调用
(5)析构函数调用顺序是,先创建的对象后被销毁(栈的后入先出原理)
(6)析构函数没有返回值
(7)一个类最多只有一个析构函数
php垃圾回收器
1、在php中,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,php将启用垃圾回收器将对象销毁,从而回收该对象占用的内存.
2、当程序退出前,php也将启用垃圾回收器,销毁对象
【示例】下面通过示例来演示一下析构函数的使用。
<?php
class Website{
public $name, $url, $title;
public function __construct(){
echo '------这里是构造函数------<br>';
}
public function __destruct(){
echo '------这里是析构函数------<br>';
}
}
$object = new Website();
echo 'C语言中文网<br>';
echo 'http://c.biancheng.net/php/<br>';
echo '脚本运行结束之前会调用对象的析构函数<br>';
?>
运行结果如下:
------这里是构造函数------
C语言中文网
http://c.biancheng.net/php/
脚本运行结束之前会调用对象的析构函数
------这里是析构函数------
示例2:代码执行完后,内存自动释放前触发
<?php
class Human
{
public $name = '张三';
public $gender = null;
public function __destruct()
{
echo '走了!<br />';
}
}
$a = new Human();
$b = $c = $d = $a;
unset($a);
echo $b->name; //输出张三
echo '<hr />'; //先输出换行线再输出走了 析构函数是在线上触发还是线下触发?
?>
---------- 编译结果 ----------
张三<hr />走了!<br />
示例3:一旦成为垃圾对象,析构函数就会立即调用
<?php
class Human
{
public $name = '张三';
public $gender = null;
public function __destruct()
{
echo '走了!<br />';
}
}
$e = $f = $g = new Human();
unset($e);
unset($f);
unset($g);
echo '<hr />';
?>
---------- 编译结果 ----------
走了!<br /><hr />
示例3:先创建的对象最后被销毁,一旦一个对象成为垃圾对象,该析构函数就会立即调用。
<?php
class Person
{
public $name;
public $age;
public function __construct($name,$age)
{
$this->name=$name;
$this->age=$age;
}
function __destruct()
{
echo $this->name."销毁资源"."\n";
}
}
$p1=new Person("贾宝玉",16);
$p1=null;
$p4=$p1; //如果是:$p4=$p1;$p1=null;呢?答案是:贾宝玉排在最后,阿杜排在第一显示
$p2=new Person("林黛玉",14);
$p3=new Person("阿杜",20);
?>
---------- 编译结果 ----------
贾宝玉销毁资源
阿杜销毁资源
林黛玉销毁资源
|