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 相关文章推荐
PHP个人网站架设连环讲(二)
Oct 09 PHP
ajax+php打造进度条代码[readyState各状态说明]
Apr 12 PHP
用php的ob_start来生成静态页面的方法分析
Mar 09 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
Feb 17 PHP
浅析PHP中Collection 类的设计
Jun 21 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
php实现批量修改文件名称的方法
Jul 23 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
Aug 11 PHP
php实现websocket实时消息推送
Mar 30 PHP
PHP xpath()函数讲解
Feb 11 PHP
php异常处理捕获错误整理
Sep 23 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php方法调用模式与函数调用模式简例
2011/09/20 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
php中使用url传递数组的方法
2015/02/11 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
Python collections模块使用方法详解
2019/08/28 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
初二政治教学反思
2014/01/12 职场文书
学年自我鉴定
2014/01/16 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
2015最新民情日记范文
2015/06/26 职场文书
《山中访友》教学反思
2016/02/24 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android
python神经网络 使用Keras构建RNN训练
2022/05/04 Python