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 相关文章推荐
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
PHP UTF8编码内的繁简转换类
Jul 20 PHP
探讨fckeditor在Php中的配置详解
Jun 08 PHP
php ci框架验证码实例分析
Jun 26 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
PHP序列化/对象注入漏洞分析
Apr 18 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 PHP
PHP巧妙利用位运算实现网站权限管理的方法
Mar 12 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 PHP
Yii实现微信公众号场景二维码的方法实例
Aug 30 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
zend framework配置操作数据库实例分析
2012/12/06 PHP
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
JavaScript中的Truthy和Falsy介绍
2015/01/01 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
js编写选项卡效果
2017/05/23 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
小区门卫值班制度
2014/01/24 职场文书
请假条怎么写
2014/04/10 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
车位出租协议书范本
2016/03/19 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
POST提交数据常见的四种方式
2022/01/18 HTML / CSS