手机版

使用php析构函数的简单说明

时间:2021-09-08 来源:互联网 编辑:宝哥软件园 浏览:

随着面向对象编程的发展,面向对象出现了许多有趣的问题。相信很多初学者在学习php面向对象的时候都会接触到两个函数,构造函数和析构函数。构造函数似乎用得比较多,析构函数用得比较少(相比初学者有限的编程经验,笔者也是如此。)功能上,创建对象时调用构造函数,销毁对象时调用析构函数,无需专门调用。

析构函数经常处理的事务是一些释放资源的工作,比如前面的fopen(),这里调用fclose(),前面的imagecreatefromjepg(),这里调用imagedestory()。这些都是常见的例子,但当然不仅限于此。我们可以把它想象成一个普通的函数,当对象被破坏或者脚本被执行的时候就会被执行。

啰嗦了这么多,还是尽快提出今天的主要问题:

?Php类测试{ public function _ _ destroy(){ echo ' execute析构函数';} } $ test1=新测试;$ test2=$ test3=$ test1unset($ test 1);echo ' HR/';这个脚本的执行结果是什么?

在回答这个问题之前,先回顾一下上面标注的单词。我们应该在输出分隔线之前考虑unset($test1),它将调用析构函数并输出文本。至于$test2,$test3应该在脚本执行后调用析构函数。也就是说,分割线以上输出一段文字,分割线以下输出两段文字。这个时候,你可以稍微骄傲一点,毕竟你知道什么时候调用析构函数。但事实真的是这样吗?我们可以看看执行结果。

嘿,他呜呜呜,他为什么输出一句话?

事实上,我们忽略了一个重要的前提条件,那就是对象的赋值默认是引用赋值。很多人都没有注意到这一点,希望初学者多加注意。

所以既然是引用赋值,结合我们对普通变量的理解,我们很快就认为三个变量名指向同一个内存地址。在这种情况下,unset($test1)扮演什么角色?销毁指向存储地址的变量还是销毁存储地址中存储的内容?

如果你知道unset()函数的用法,请直观地跳过这一段。

想着这个蛋疼的问题,还不如查查说明书。

同样是传递引用,只有指向存储地址的变量名被销毁。结合unset()的正规函数,我们可以这样描述:当多个变量名或对象名指向一个存储地址时,unset()函数只破坏变量名和存储地址的指向;当只有一个变量名或对象名时,unset会销毁指定存储地址的内容。

我们可以想象,真正存储的内容是一台电视。多人(多个变量名或对象名)在看电视。Unset(),一个人不看了,离开了,电视还开着。当只有一个人看电视时,当人们在unset()后离开时,关闭电视,即释放占用的存储空间。如果你对这部分感兴趣,也可以阅读《php 递归函数的三种实现方式》。

好了,回到主题。在unset($test1)之后,原始对象仍然存在。输出分割线时,执行脚本并调用析构函数。因为只有一个对象,析构函数只被调用一次。输出上述结果是合理的。

其他几个相关的有趣问题:在程序中有很多方法可以调用析构函数。无论对象设置为null还是false,其余对象都不会受到影响。这与普通变量不同。(unset()函数也有同样的效果。).如果你感兴趣,你可以试试。

另一个尴尬的事情:我们都知道构造函数可以使用__construct(),但是忽略同名的构造函数。因此,我们应该注意。

最后,让我们看一个例子

?php /* *创建于2009-11-18 * *要更改此生成文件的模板,请转到*窗口-首选项- PHPeclipse - PHP -代码模板*/班级学生{ //属性私人$ noprivate $ name私人$性别;私人$年龄;私有静态$ count=0;function _ _ construct($ pname){ $ this-name=$ pname;自我:美元计数;} function _ _ destrust(){ self : $ count-;}静态函数get _ count(){ return self : $ count;} } $ s1=新学生(“汤姆”);print(学生: get _ count());$ s2=新生(“杰瑞”);print(学生: get _ count());$ s1=空;print(学生: get _ count());$ s2=空;print(学生: get _ count());上面这段代码就是PHP5析构函数的具体使用方法,希望对大家有所帮助。

版权声明:使用php析构函数的简单说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。