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代码优化及php相关问题总结
Oct 09 PHP
用PHP中的 == 运算符进行字符串比较
Nov 26 PHP
php木马攻击防御之道
Mar 24 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
preg_match_all使用心得分享
Jan 31 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
JavaScript实现删除电脑的关机键
Jul 26 PHP
PHP合并数组函数array_merge用法分析
Feb 17 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
[原创]php正则删除html代码中class样式属性的方法
May 24 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.ini中文版(1)
2006/10/09 PHP
php正则表达式(regar expression)
2011/09/10 PHP
preg_match_all使用心得分享
2014/01/31 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
IE8 原生JSON支持
2009/04/13 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
javascript实现商品图片放大镜
2019/11/28 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
Python中断言Assertion的一些改进方案
2016/10/27 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
python去除文件中重复的行实例
2018/06/29 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
Pretty Green美国:英式摇滚服饰风格代表品牌之一
2019/01/23 全球购物
手工社团活动方案
2014/02/17 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
推广普通话的宣传语
2015/07/13 职场文书
JavaScript中reduce()的用法
2022/05/11 Javascript