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 这行代码到底让零碎做了甚么事件
连系下面的代码,其实咱们写的代码程序是
$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 做了甚么事件
零碎所干事情以下:
一、创立变量,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/>"; ?>
执行后果以下:
以是$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开发自学 面向对象 析构函数 对象引用
抱歉,评论功能暂时关闭!