php析构函数的简单使用说明


Posted in PHP onAugust 24, 2015

随着面向对象编程的普遍展开,面向对象展现了其中很多有趣的问题。相信很多初学者学习php面向对象时会接触两个函数,构造函数与析构函数。构造函数似乎用的更多,析构函数用的较少(相对初学者有限编程经验而言,笔者也是如此。)在功能上,构造函数在创建对象时调用,析构函数在对象销毁时调用,都无需特意去调用,一头一尾,倒也是前后照应。

析构函数常常处理的事务是一些资源释放的工作,比如前面有fopen(),这里调用fclose(),前面有imagecreatefromjepg(),这里调用imagedestory(),这些都是些常见的例子,当然不局限于此。我们大可将其当做一个普通的会在对象销毁或者脚本执行完毕的时候执行的函数。

??履敲炊啵?故蔷≡缣岢鼋裉斓闹饕?奈侍猓?/p>

<?php
class Test{
 public function __destruct(){
  echo "执行析构函数";
 }
 }
$test1=new Test;
$test2=$test3=$test1;
unset($test1);
echo "<hr/>";

这段脚本执行结果是什么?

在回答这个问题之前,回看我上面标示的几个字。我们可以理所应当的认为在输出分隔线前 unset($test1) ,这样会调用析构函数,输出文字,至于 $test2,$test3 应该会在脚本执行完毕调用析构函数。也就是说,在分割线上面,会输出一段文字,分隔线下面会输出两段文字。 在这个时候,大可以小骄傲一下,毕竟自己懂得什么时候调用析构函数。但现实真是如此么?我们可以看一下执行结果。

php析构函数的简单使用说明

嘿,他喵的,怎么就输出了一句啊???

其实我们忽略了一个重要的前提条件,就是对象的赋值默认的是引用赋值。这一点很多人没有注意到,希望初学者能多多注意一下。

那么既然是引用赋值,结合我们对普通变量的理解,我们很快想到,三个变量名指向同一块存储地址。那么既然如此的话, unset($test1) 起到的是什么作用???破坏变量指向存储地址还是破坏存储地址存储的内容?

了解unset()函数用法的请直觉跳过本段。

想着这蛋疼的问题,莫不如去查看手册。

同样是传递引用,毁掉的仅仅是变量名指向存储地址。结合平常unset()的作用,我们可以这么描述,当多个变量名或者对象名指向一块存储地址时,unset()函数的作用仅仅是销毁变量名和存储地址的指向而已,当仅有一个变量名或者对象名,unset销毁的是指定的存储地址上的内容。

我们可以想象真实的存储内容是一台电视。多个人(多个变量名或对象名)在看一台电视。unset()后,一个人不看了,离开了,电视还开着。当只有一个人看电视的时候,unset()后,人离开的时候,要把电视关了 ,也就是释放占用的存储空间。对这部分内容感兴趣的话也可以看一下《php 递归函数的三种实现方式》。

php析构函数的简单使用说明

好的,回归主题。 unset($test1) 后, 原来的对象还在。当输出分割线后,脚本执行完毕,调用析构函数。 因为对象只有一个,调用析构函数也只调用一次。输出如上结果也就理所应当。

其他几个相关的有意思的问题:在程序中调用析构函数的方法还有很多。无论是设置对象为null,还是false,其余的对象依旧不受影响。这和普通变量还是有区别的。(unset()函数的效果是一样的)。有兴趣的话可以试试。

另外说一个比较?宓氖虑椋何颐嵌贾?拦乖旌??梢允褂?_construct(),却忽视了同名构造函数。所以,大家还是留心一下。

最后我们来看个例子

<?php 
/* 
 * Created on 2009-11-18 
 * 
 * To change the template for this generated file go to 
 * Window - Preferences - PHPeclipse - PHP - Code Templates 
 */ 
 class student{ 
 //属性 
 private $no; 
 private $name; 
 private $gender; 
 private $age; 
 
 private static $count=0; 
 function __construct($pname) 
 { 
 $this->name = $pname; 
 self::$count++; 
 } 
 
 function __destruct() 
 { 
 self::$count--; 
 } 
 
 static function get_count() 
 { 
 return self::$count; 
 } 
 } 
 
 $s1=new student("Tom"); 
 print(student::get_count()); 
 
 $s2=new student("jerry"); 
 print(student::get_count()); 
 
 $s1=NULL; 
 print(student::get_count()); 
 
 $s2=NULL; 
 print(student::get_count()); 
?>

上面这段代码就是PHP5析构函数的具体使用方法,希望对大家有所帮助。

PHP 相关文章推荐
PHP4之COOKIE支持详解
Oct 09 PHP
php 学习资料零碎东西
Dec 04 PHP
PHP的explode和implode的使用说明
Jul 17 PHP
php伪静态之APACHE篇
Jun 02 PHP
详解PHP+AJAX无刷新分页实现方法
Nov 03 PHP
php实现处理输入转义字符的代码
Nov 08 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
详解PHP序列化和反序列化原理
Jan 15 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
Yii框架Session与Cookie使用方法示例
Oct 14 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 #PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 #PHP
详细解读PHP的Yii框架中登陆功能的实现
Aug 21 #PHP
使用PHP进行微信公众平台开发的示例
Aug 21 #PHP
PHP的Yii框架的基本使用示例
Aug 21 #PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 #PHP
win7系统配置php+Apache+mysql环境的方法
Aug 21 #PHP
You might like
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
PHP使用glob函数遍历目录或文件夹的方法
2014/12/16 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
基于jQuery的js分页代码
2010/06/10 Javascript
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
基于Python实现的ID3决策树功能示例
2018/01/02 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
学生不讲诚信检讨书
2014/09/29 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
环境卫生标语
2015/08/03 职场文书
python 实现定时任务的四种方式
2021/04/01 Python
python scrapy简单模拟登录的代码分析
2021/07/21 Python