php面向对象之析构函数和对象引用-php教程

资源魔 31 0

PHP面向工具之析构函数以及工具援用


本文学习指标:

一、理解析构函数的界说

二、理解析构函数的作用

三、理解析构函数的特性

四、把握工具援用赋值的概念以及特性

(一)、析构函数

一、界说它是一个非凡的函数

public function destruct(){}

二、作用:清算工具,开释内存

三、特性:

一、主动执行,而非手动挪用

二、类一旦界说了析构函数,顺序完结前就会销毁该类下的一切实例工具

三、正在使用顺序完结前的最初一刻执行,除了非一些非凡状况,比方第4点,或许当工具的生命周期完结当前也会主动执行

四、 一旦咱们手动的销毁一个工具,零碎会主动的触发该工具的析构函数

特地留意一个非凡的状况:就是假如工具还被其余工具援用的状况下,它的析构函数也没有会被触发

五、正在工具的生命周期完结前执行

六、使用顺序完结前的最初一刻,会销毁掉还未销毁的工具,曾经销毁的工具没有会再次被销毁

进一步患上出,一个工具的析构函数只能执行1次,没有会执行屡次

七、正在php中假如咱们没有为类界说个析构函数,那末php会主动的为类创立一个析构函数,而后正在

顺序完结前挪用默许的析构函数,然而一旦界说了析构函数,就会执行咱们写的析构函数

进一步咱们就能够正在本人的析构函数里写本人的营业代码

比方假如顺序应用了打印机资本,咱们能够销毁工具前开释打印机资本

相干的代码以下:

<?php

 class NbaPlayer{
   
    public $name  = "";//姓名
    public $height = "";//身高
    public $weight = "";//体重
    public $team = "";//团队
    public $playerName = "";//球员号码

    
    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        echo "结构函数执行了,以后工具是{$this->name}<br/>";
    }
    //析构函数
    public function __destruct(){
        echo "销毁工具".$this->name."<br/>";
    }
   
   //跑步
    public function run(){
        echo "跑步中<br/>";
    }
    //腾跃
    public function jump(){
        echo "腾跃<br/>";
    }
    //运球
    public function dribble(){
        echo "运球<br/>";
    } 
    //传球
    public function pass(){
        echo "传球<br/>";
    }
    //投篮
    public function shoot(){
        echo "投篮<br/>";
    }
    //扣篮
    public function dunk(){
        echo "扣篮<br/>";
    }

 }
 //创立乔丹工具
$jordon = new NbaPlayer("乔丹","1.98米","98千克","公牛","23");
//输入乔丹工具
echo "称号= ".$jordon->name."<br/>";
//让乔丹跑步
$jordon->run();

//创立科比工具
$kobe = new NbaPlayer("科比","2米","93千克","湖人","24");
//创立詹姆斯工具
$james = new NbaPlayer("詹姆斯","2.03米","120千克","热火","6");
$james1 = new NbaPlayer("詹姆斯1","2.03米","120千克","热火","6");
$james2 = new NbaPlayer("詹姆斯2","2.03米","120千克","热火","6");

$jordon = null;//手动的销毁了工具 ,此时乔丹工具的析构函数将会被触发

$kobe = null;//手动的销毁了工具 ,此时科比工具的析构函数将会被触发


echo "<b>顺序完结终了</b><br/>";
?>

接上去,我代码修正以下,增加一个Mysql数据库衔接类,而后正在NbaPlayer结构函数外面挪用它

这是Mysql.class.php,外面界说了一个析构函数

<?php
//数据库类
class Mysql{
    //界说属性
    public $conn = "";
    //结构函数
    public function __construct( ){
        //初始化行为 初始化办法
        $this->initConn();
    }
    //析构函数 销毁数据库衔接
    public function __destruct(){
        //销毁衔接
        if( $this->conn ){
            mysqli_close( $this->conn );
            echo "销毁了衔接<br/>";
        }
    }
    
    //界说办法
    //创立公共的办法 猎取数据库衔接
    public function initConn(){
        $config = Array(
            "hostname"=>"127.0.0.1",
            "database"=>"Nbaplayer",
            "username"=>"root",
            "password"=>"root"
        );
        $this->conn = mysqli_connect( $config['hostname'],$config['username'] ,$config['password'],
                $config['database']);
    }
}
?>

接上去仍是界说个NbaPlayer类,然而为了突出重点,以是NbaPlayer类我会简写以下:

<?php
 require_once "Mysql.class.php";
 class NbaPlayer{
   
    public $name  = "";//姓名
    public $height = "";//身高
    public $weight = "";//体重
    public $team = "";//团队
    public $playerName = "";//球员号码
    public $conn = "";//增加一个数据库衔接属性

    
    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        //初始化数据库衔接属性
        $mysql = new Mysql();
        $this->conn = $mysql->conn;
        
    }
    //新增猎取一切Nba球员的办法
     public function getAll(){
         //创立数据库衔接
        $conn = $this->conn;
        //写sql
        $sql = " select * from ".$this->tableName;
        //执行sql
        $result = mysqli_query( $conn,$sql );
        //猎取数据
        // mysqli_fetch_all($result)//特性:没有会蕴含字段名
        $list = Array();
        while( $row = mysqli_fetch_assoc(  $result ) ){
            $list[] = $row;
        }
        //前往数据
        return $list;
     }

 }
 //创立乔丹工具
$jordon = new NbaPlayer("乔丹","1.98米","98千克","公牛","23");

$list = $jordon->getAll();

echo "<b>顺序完结终了</b><br/>";
?>

当你运转,你会发现谬误,会发现衔接曾经被销毁,正在getAll函数挪用以前,也就是说,一旦 实例化了 $jordon = new NbaPlayer("乔丹","1.98米","98千克","公牛","23");

数据库衔接工具就销毁了,其实假如你去调试,你会发现,结构函数里的mysql工具实际上是正在NbaPlayer类的结构函数的最初一个}执行实现后,它就会被销毁,为何呢

这其实就触及到变量作用域的成绩,由于mysql工具是正在结构函数里界说的,以是里面是无奈拜访到它的,以是一旦结构函数执行实现后,零碎会以为它将再也不有用,以是就会

把它清算掉,从而执行它的析构函数,以是终极你去挪用getAll办法的时分,数据库衔接都早已断开,天然无奈再去执行sql,

其实想要处理掉这个成绩,那末就需求理解工具援用,咱们能够连系工具援用来处理这个成绩,接上去先来理解工具援用

(二)、工具援用

总结:

一、变量1=变量2=工具 会创立工具的2个自力援用,然而他们指向的仍是同一个工具,以是仍是会相互影响

二、变量1=&变量2 只会创立工具的一个援用,由于它们应用同一个工具援用

三、一个工具有无用,就要看它能否齐全不被援用了,假如不任何变量援用它,它就真的没用了,

才会被销毁,进而它的析构函数才会患上以执行

四、变量1=clone 变量2=工具,没有会创立工具的新援用,而是仿制了一个新的该工具,具备该工具通用的属性以及办法

相干代码以下:

<?php

 class NbaPlayer{
   
    public $name  = "";//姓名
    public $height = "";//身高
    public $weight = "";//体重
    public $team = "";//团队
    public $playerName = "";//球员号码

    
    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        echo "结构函数执行了,以后工具是{$this->name}<br/>";
    }
    public function __destruct(){
        echo "销毁工具".$this->name."<br/>";
    }
   
   //跑步
    public function run(){
        echo "跑步中<br/>";
    }
    //腾跃
    public function jump(){
        echo "腾跃<br/>";
    }
    //运球
    public function dribble(){
        echo "运球<br/>";
    } 
    //传球
    public function pass(){
        echo "传球<br/>";
    }
    //投篮
    public function shoot(){
        echo "投篮<br/>";
    }
    //扣篮
    public function dunk(){
        echo "扣篮<br/>";
    }

 }
 //创立乔丹工具
$jordon = new NbaPlayer("乔丹","1.98米","98千克","公牛","23");
//输入乔丹工具
echo "称号= ".$jordon->name."<br/>";
//让乔丹跑步
$jordon->run();

//创立科比工具
$kobe = new NbaPlayer("科比","2米","93千克","湖人","24");
//创立詹姆斯工具
$james = new NbaPlayer("詹姆斯","2.03米","120千克","热火","6");
$james1 = new NbaPlayer("詹姆斯1","2.03米","120千克","热火","6");
$james2 = new NbaPlayer("詹姆斯2","2.03米","120千克","热火","6");

 $jordon1 = $jordon;//&符号示意右边工具以及左边工具其实就是一个工具
 $jordon = null;//手动的销毁了工具 


echo "<b>顺序完结终了</b><br/>";
?>

重点解析:原本没有加$jordon1 = $jordon;当顺序执行到$jordon=null,乔丹工具的析构函数将会被执行,也就是说 “销毁工具乔丹”正在“顺序完结终了” 前显示
然而加了这句当前,你会发现执行到$jordon=null的时分,乔丹工具的析构函数并无即刻执行,而是到使用顺序完结后才被零碎主动执行 ,也就是说

“销毁工具乔丹”正在“顺序完结终了” 后显示

为何会这样:

接上去就来详细剖析$jordon1 = $jordon 这行代码到底让零碎做了甚么事件

1.png

连系下面的代码,其实咱们写的代码程序是

$jordon = new NbaPlayer("乔丹","1.98米","98千克","公牛","23");

$jordon1 = $jordon;

那末$jordon = new NbaPlayer("乔丹","1.98米","98千克","公牛","23");

阐明就是

一、创立了乔丹工具

二、创立了一个变量,变量名叫jordon

三、创了一个乔丹工具的自力援用,就是上图的箭头

而后$jordon1 = $jordon;

阐明就是

一、创立了一个新的变量,名叫jordon1

二、又创立了一个乔丹工具的自力援用,就是上图的第二个箭头

那末阐明 乔丹工具此时被两个变量援用,当咱们$jordon=null 的时分,乔丹工具还被jordon1变量援用,以是此时乔丹工具另有用,另有用就不克不及当作渣滓清算掉,

以是这就能够诠释下面的成绩,乔丹工具 正在最初 才会被零碎销毁,以是要看一个工具能否有用,要看它到底还存没有存正在变量援用,假如齐全没有存正在变量援用了,那末这个

工具才能够被视作齐全无用,它的析构函数才会被执行

好这是工具援用赋值的一种方式,另有另一种 就是 =&

代码以下:

<?php

 class NbaPlayer{
   
    public $name  = "";//姓名
    public $height = "";//身高
    public $weight = "";//体重
    public $team = "";//团队
    public $playerName = "";//球员号码

    
    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        echo "结构函数执行了,以后工具是{$this->name}<br/>";
    }
    public function __destruct(){
        echo "销毁工具".$this->name."<br/>";
    }
   
   //跑步
    public function run(){
        echo "跑步中<br/>";
    }
    //腾跃
    public function jump(){
        echo "腾跃<br/>";
    }
    //运球
    public function dribble(){
        echo "运球<br/>";
    } 
    //传球
    public function pass(){
        echo "传球<br/>";
    }
    //投篮
    public function shoot(){
        echo "投篮<br/>";
    }
    //扣篮
    public function dunk(){
        echo "扣篮<br/>";
    }

 }
 //创立乔丹工具
$jordon = new NbaPlayer("乔丹","1.98米","98千克","公牛","23");
//输入乔丹工具
echo "称号= ".$jordon->name."<br/>";
//让乔丹跑步
$jordon->run();

//创立科比工具
$kobe = new NbaPlayer("科比","2米","93千克","湖人","24");
//创立詹姆斯工具
$james = new NbaPlayer("詹姆斯","2.03米","120千克","热火","6");
$james1 = new NbaPlayer("詹姆斯1","2.03米","120千克","热火","6");
$james2 = new NbaPlayer("詹姆斯2","2.03米","120千克","热火","6");

 $jordon1 = &$jordon;//&符号示意右边工具以及左边工具其实就是一个工具
 $jordon = null;//手动的销毁了工具 


echo "<b>顺序完结终了</b><br/>";
?>

当咱们把下面的代码仅仅加之一个 &,也就是把$jordon1 = $jordon 改为 $jordon1 =& $jordon,你会发现后果又变了

变为甚么呢,就是当执行$jordon=null的时分,乔丹工具的析构函数仍是被执行了,为何呢

咱们再来看下 $jordon1 = & $jordon 做了甚么事件

2.png

零碎所干事情以下:

一、创立变量,jordon1

二、而后没有会再次创立乔丹工具援用,$jordon1经过$jordon变量来应用同一个工具援用来拜访乔丹工具

以是此时乔丹工具,只有一个工具援用,没有是2个,以是当咱们$jordon=null的时分,其实就是销毁了那惟一的工具援用,进而招致乔丹工具齐全不了工具援用,以是他的析构函数此时会被触发执行

不论是$jordon1=$jordon 仍是 $jordon1=&jordon ,修正恣意变量外面的称号,城市招致另外变量的称号被修正掉,由于他们都是援用的同一个乔丹工具

其实工具赋值,除了了下面2种形式外,另有第三种,就是 clone(浅复制) ,也就是比方$jordon1 = clone $jordon;

那这样的赋值形式它终究又是甚么意义呢,其实相称于 仿制了 一个乔丹工具

接上去咱们经过代码演示

<?php

 class NbaPlayer{
   
    public $name  = "";//姓名
    public $height = "";//身高
    public $weight = "";//体重
    public $team = "";//团队
    public $playerName = "";//球员号码

    
    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        // echo "结构函数执行了,以后工具是{$this->name}<br/>";
    }
    public function __destruct(){
        echo "销毁了工具".$this->name."<br/>";
    }
   
   //跑步
    public function run(){
        echo "跑步中<br/>";
    }
    //腾跃
    public function jump(){
        echo "腾跃<br/>";
    }
    //运球
    public function dribble(){
        echo "运球<br/>";
    } 
    //传球
    public function pass(){
        echo "传球<br/>";
    }
    //投篮
    public function shoot(){
        echo "投篮<br/>";
    }
    //扣篮
    public function dunk(){
        echo "扣篮<br/>";
    }

 }
 //创立乔丹工具
$jordon = new NbaPlayer("乔丹","1.98米","98千克","公牛","23");

$jordon1 = clone $jordon;
$jordon1 = null;
$jordon = null;

echo "使用顺序完结<br/>";


?>

执行后果以下:

3.png

以是$jordon1=clone $jordon;其实就是 仿制了一个乔丹工具,领有以及乔丹工具同样的属性以及办法

到今朝为止,咱们理解了工具援用,那末连系工具援用,咱们若何处理最开端的阿谁成绩呢?

各人考虑一下再看上面的处理计划

....................................

好,接上去咱们来看下面咱们遇到的成绩

成绩是:mysql工具正在结构函数执行终了后,就被销毁了,招致前面getAll函数里的数据库衔接无奈应用

处理思绪:

1.mysql工具正在结构函数执行实现后,就被销毁了,阐明mysql工具此时不了工具援用

2.那咱们就要让他正在结构函数执行实现后,仍然存正在工具援用,那末mysql工具就另有用,另有用就没有会被销毁

3.正在结构函数里,创立mysql工具的援用,让它正在结构函数执行实现后,这个援用仍然存正在

4.咱们能够界说个类的新属性比方$mysql,而后让$this->mysql = $mysql;这样就创立了一个mysql工具的自力援用,并且当结构函数执行实现后

类的mysql属性另有用,以是这个工具援用另有用,进而mysql工具另有用,就没有会被销毁

详细代码以下:

<?php
 require_once "Mysql.class.php";
 class NbaPlayer{
   
    public $name  = "";//姓名
    public $height = "";//身高
    public $weight = "";//体重
    public $team = "";//团队
    public $playerName = "";//球员号码
    public $conn = "";//增加一个数据库衔接属性
    public $mysql = "";//新增一个mysql属性

    
    public function __construct( $name,$height,$weight,$team,$playerName ){
        $this->name = $name;
        $this->height=$height;
        $this->weight = $weight;
        $this->team = $team;
        $this->playName = $playerName;
        //初始化数据库衔接属性
        $mysql = new Mysql();
        $this->conn = $mysql->conn;
        //处理成绩的重点代码
        $this->mysql = $mysql;//加了这行代码,getAll中的conn 数据库衔接就没有会销毁
        
    }
    //新增猎取一切Nba球员的办法
     public function getAll(){
         //创立数据库衔接
        $conn = $this->conn;
        //写sql
        $sql = " select * from ".$this->tableName;
        //执行sql
        $result = mysqli_query( $conn,$sql );
        //猎取数据
        // mysqli_fetch_all($result)//特性:没有会蕴含字段名
        $list = Array();
        while( $row = mysqli_fetch_assoc(  $result ) ){
            $list[] = $row;
        }
        //前往数据
        return $list;
     }

 }
 //创立乔丹工具
$jordon = new NbaPlayer("乔丹","1.98米","98千克","公牛","23");

$list = $jordon->getAll();

echo "<b>顺序完结终了</b><br/>";
?>

好了,最初咱们再略微做下总结:

一、理解了析构函数的界说,它其实就是一个非凡函数

二、理解了析构函数的作用,就是8个字,清算工具,开释内存

三、理解了析构函数的特性,特性有点多,次要7点

四、晓得了工具援用的3种赋值形式,一个是=一个是=&,另有一个是clone

以上就是php面向工具之析构函数以及工具援用的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 面向对象 析构函数 对象引用

抱歉,评论功能暂时关闭!