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 相关文章推荐
屏蔽浏览器缓存另类方法
Oct 09 PHP
PHP中调用ASP.NET的WebService的代码
Apr 22 PHP
基于php权限分配的实现代码
Apr 28 PHP
使用php实现截取指定长度
Aug 06 PHP
PHP类继承 extends使用介绍
Jan 14 PHP
ThinkPHP基本的增删查改操作实例教程
Aug 22 PHP
php+MySql实现登录系统与输出浏览者信息功能
Jul 01 PHP
php微信开发之自定义菜单实现
Nov 18 PHP
php变量与JS变量实现不通过跳转直接交互的方法
Aug 25 PHP
PHP实现的支付宝支付功能示例
Mar 26 PHP
PHP defined()函数的使用图文详解
Jul 20 PHP
laravel框架创建授权策略实例分析
Nov 22 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 radio 单选框获取与保持值的实现代码
2010/05/15 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
Laravel 队列使用的实现
2019/01/08 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
浅谈PHP中的那些魔术常量
2020/12/02 PHP
JS高级笔记
2011/07/13 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
python画图的函数用法以及技巧
2019/06/28 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
python yield关键词案例测试
2019/10/15 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
Python request post上传文件常见要点
2020/11/20 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
初中三好学生事迹材料
2014/01/13 职场文书
爱心活动计划书
2014/04/26 职场文书
党委班子对照检查材料
2014/08/19 职场文书
药店采购员岗位职责
2014/09/30 职场文书
历史博物馆观后感
2015/06/05 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL