开启辅助访问
帐号登录 |立即注册

PHP面向对象编程 __destruct():析构函数/方法详解

 
析构函数的作用和构造函数正好相反,析构函数只有在对象被垃圾收集器收集前(即对象从内存中删除之前)才会被自动调用。析构函数允许我们在销毁一个对象之前执行一些特定的操作,例如关闭文件、释放结果集等。
在 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);
?>
---------- 编译结果 ----------
贾宝玉销毁资源
阿杜销毁资源
林黛玉销毁资源



回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

友情链接
  • 艾Q网

    提供设计文章,教程和分享聚合信息与导航工具,最新音乐,动漫,游戏资讯的网站。