当你必须在课堂上使用__destruct时,请给我一些真实的例子.
好吧,因为我的上一个答案显然没有达到标准,让我再试一次.这个主题在互联网上有很多资源和例子.做一些搜索和浏览其他框架的代码,你会看到一些很好的例子......
不要忘记,仅仅因为PHP会在终止时关闭资源并不意味着当你不再需要它们时显然关闭它们(或者好不关闭它们)...这取决于用例(它是否一直被使用到最后,或者是否有一个早期的呼叫,然后不再需要其余的执行)...
现在,我们知道__destruct
在对象被销毁时会调用它.从逻辑上讲,如果对象被销毁会发生什么?嗯,这意味着它已不再可用.因此,如果它有资源开放,那么关闭这些资源是否有意义,因为它被摧毁了?当然,在普通网页中,页面将很快终止,所以让PHP关闭它们通常并不可怕.但是,如果由于某种原因脚本长时间运行会发生什么?然后你有资源泄漏.那么,为什么不在不再需要它时关闭所有内容(或者考虑析构函数的范围,当它不再可用时)?
以下是现实世界框架中的一些示例:
锂电锂\网\插座类
Kohana的Memcached司机
Joomla的FTP实现
Zend Frameworks的SMTP邮件传输类
CodeIgniter的TTemplate类
一个整洁的蛋糕过滤器助手
关于为Symfony会话类使用析构函数的Google-Groups线程
有趣的是Kohana跟踪标签,以便以后可以通过"命名空间"删除(而不是仅仅清除缓存).因此,它使用析构函数将这些更改刷新到硬盘存储.
CodeIgniter类也做了一些有趣的事情,它将调试输出添加到析构函数中的输出流.我不是说这很好,但它是另一种用途的例子......
每当我在主控制器上运行很长时间时,我个人都会使用析构函数.在构造函数中,我检查一个pid
文件.如果该文件存在(并且其进程仍在运行),则抛出异常.如果没有,我创建一个包含当前进程ID的文件.然后,在析构函数中删除该文件.因此,除了释放资源之外,更多的是清理自己...
生成HTML页面还有另一个方便的用途
class HTMLgenerator { function __construct() { echo ""; } function __destruct() { echo ""; } }
有了这门课,你就可以写了
$html = new HTMLgenerator(); echo "Hello, world!";
结果是
Hello, world!
例如:
这是一个很好的使用destruct的原因.您可以始终阻止对会话源的读取和写入,并且仅在开始和结束时执行此操作.