PHP __destruct函数

PHP引擎会在脚本执行完成后进行垃圾回收,那么是否还需要destruct呢?在stackoverflow上看到的一个很好的答复

析构函数本身跟内存释放没有任何直接的关系,它只是当一个对象被回收时执行自定义代码的“钩子”。它的作用跟构造函数刚好相反-构造函数本身也不申请内存(内存的申请和释放都是GC的事)。
GC能够很好的管理PHP原生的资源(比如对象),但是对于外部资源却必须手动处理。比如,一个文件管理的类,析构函数的作用就是保证如果文件被打开了,就应该被关闭。虽然“最好”在一个对象上要求去调用一个关闭或处理操作,这时析构函数就作为一种援助机制。
我本身反对将析构函数与GC一起使用。有许多微妙的问题他们可以引入如明显的非确定性和意外的能力保持对象存活——甚至在像PHP这种使用引用计数的语言里面。(Java/JVM和.net使用终结器更为挑剔。)

总结下,就是析构函数本身跟垃圾回收没有什么关系,但它应该用来确保一些外部资源被关闭,比如文件操作和数据库连接。
在一个项目中,我们可能只会使用一个数据库连接类,但是我们又不能随时关闭它,因为不能确定其他的地方是否有用到,那么就在析构函数里确保它关闭,否则PHP也不会手动去释放它,否则可能会经常遇到Mysql达到最大连接数的问题。为什么需要手动去释放资源呢?可以参阅鸟哥的文章

参考链接:
Is the __destruct method necessary for PHP?
请手动释放你的资源(Please release resources manually)
[原创] 从 PHP 代码分析 PHP 的 GC(垃圾回收) 机制
PHP 垃圾回收机制

发表评论

电子邮件地址不会被公开。 必填项已用*标注