php析构函数的简单使用说明
随着面向对象编程的普遍展开,面向对象展现了其中很多有趣的问题。相信很多初学者学习php面向对象时会接触两个函数,构造函数与析构函数。构造函数似乎用的更多,析构函数用的较少(相对初学者有限编程经验而言,笔者也是如此。)在功能上,构造函数在创建对象时调用,析构函数在对象销毁时调用,都无需特意去调用,一头一尾,倒也是前后照应。
析构函数常常处理的事务是一些资源释放的工作,比如前面有fopen(),这里调用fclose(),前面有imagecreatefromjepg(),这里调用imagedestory(),这些都是些常见的例子,当然不局限于此。我们大可将其当做一个普通的会在对象销毁或者脚本执行完毕的时候执行的函数。
啰嗦那么多,还是尽早提出今天的主要的问题:
<?php
class Test{
public function __destruct(){
echo "执行析构函数";
}
}
$test1=new Test;
$test2=$test3=$test1;
unset($test1);
echo "<hr/>";
这段脚本执行结果是什么?
在回答这个问题之前,回看我上面标示的几个字。我们可以理所应当的认为在输出分隔线前 unset($test1) ,这样会调用析构函数,输出文字,至于 $test2,$test3 应该会在脚本执行完毕调用析构函数。也就是说,在分割线上面,会输出一段文字,分隔线下面会输出两段文字。 在这个时候,大可以小骄傲一下,毕竟自己懂得什么时候调用析构函数。但现实真是如此么?我们可以看一下执行结果。
执行析构函数
嘿,他喵的,怎么就输出了一句啊???
其实我们忽略了一个重要的前提条件,就是对象的赋值默认的是引用赋值。这一点很多人没有注意到,希望初学者能多多注意一下。
那么既然是引用赋值,结合我们对普通变量的理解,我们很快想到,三个变量名指向同一块存储地址。那么既然如此的话, unset($test1) 起到的是什么作用???破坏变量指向存储地址还是破坏存储地址存储的内容?
了解unset()函数用法的请直觉跳过本段。
想着这蛋疼的问题,莫不如去查看手册。
同样是传递引用,毁掉的仅仅是变量名指向存储地址。结合平常unset()的作用,我们可以这么描述,当多个变量名或者对象名指向一块存储地址时,unset()函数的作用仅仅是销毁变量名和存储地址的指向而已,当仅有一个变量名或者对象名,unset销毁的是指定的存储地址上的内容。
我们可以想象真实的存储内容是一台电视。多个人(多个变量名或对象名)在看一台电视。unset()后,一个人不看了,离开了,电视还开着。当只有一个人看电视的时候,unset()后,人离开的时候,要把电视关了 ,也就是释放占用的存储空间。对这部分内容感兴趣的话也可以看一下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析构函数的具体使用方法,希望对大家有所帮助。
- GoldenGate复制的三个简单测试场景(r10笔记第83天)
- Golang语言调用百度帐号
- Golang语言 加密系列之AES
- 转--Golang语言 rpc 简单范例
- Golang语言 之网络
- Golang语言作为服务器,H5作为前端的视频传输
- Pandas——高效的数据处理Python库
- Oracle中的段(r10笔记第81天)
- 转-- Golang中timer定时器实现原理
- Golang语言 -并行程序
- 深度学习中的优化问题以及常用优化算法
- GoldenGate简单复制环境的搭建(r10笔记第79天)
- 在Golang语言中统计程序执行时间
- 经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Go 使用标准库 net/rpc 包
- 强大的 Stream API(三)
- 微软发布代码智能新基准数据集CodeXGLUE,多角度衡量模型优劣
- 强大的 Stream API(二)
- 无限想象空间,用Python玩转3D人体姿态估计
- 300亿美元,AMD为什么要买Xilinx?
- Angular5.0.0新特性
- 用Python实现坦克大战游戏 | 干货贴
- android studio 3.0 升级 项目遇到的问题及更改思路(问题小结)
- Android Studio 3.0被调方法参数名提示的取消方法
- Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
- 解决python多线程报错:AttributeError: Can't pickle local object问题
- TensorFlow2.1.0最新版本安装详细教程
- Android仿京东首页秒杀倒计时
- 超实用的android自定义log日志输出工具类