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 相关文章推荐
4.与数据库的连接
Oct 09 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
Feb 15 PHP
PHP编译configure时常见错误的总结
Aug 17 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
PHP自定义函数实现数组比较功能示例
Oct 19 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
Nov 06 PHP
Laravel实现短信注册的示例代码
May 29 PHP
Laravel框架实现的rbac权限管理操作示例
Jan 16 PHP
Laravel框架搜索分页功能示例
Feb 01 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 Document 代码注释规范
2009/04/13 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
YII框架中搜索分页jQuery写法详解
2016/12/19 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
jquery获取复选框被选中的值
2014/03/22 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
基于wordpress的ajax写法详解
2018/01/02 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Python爬取破解无线网络wifi密码过程解析
2019/09/17 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
什么是Web Service?
2012/07/25 面试题
烹饪自我鉴定
2014/03/01 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
锅炉工岗位职责
2015/02/13 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
使用python绘制分组对比柱状图
2022/04/21 Python