Php Destructors

dan*_*car 63 php destructor

当你必须在课堂上使用__destruct时,请给我一些真实的例子.

irc*_*ell 43

好吧,因为我的上一个答案显然没有达到标准,让我再试一次.这个主题在互联网上有很多资源和例子.做一些搜索和浏览其他框架的代码,你会看到一些很好的例子......

不要忘记,仅仅因为PHP会在终止时关闭资源并不意味着当你不再需要它们时显然关闭它们(或者好不关闭它们)...这取决于用例(它是否一直被使用到最后,或者是否有一个早期的呼叫,然后不再需要其余的执行)...

现在,我们知道__destruct在对象被销毁时会调用它.从逻辑上讲,如果对象被销毁会发生什么?嗯,这意味着它已不再可用.因此,如果它有资源开放,那么关闭这些资源是否有意义,因为它被摧毁了?当然,在普通网页中,页面将很快终止,所以让PHP关闭它们通常并不可怕.但是,如果由于某种原因脚本长时间运行会发生什么?然后你有资源泄漏.那么,为什么不在不再需要它时关闭所有内容(或者考虑析构函数的范围,当它不再可用时)?

以下是现实世界框架中的一些示例:

  1. 锂电锂\网\插座类
  2. Kohana的Memcached司机
  3. Joomla的FTP实现
  4. Zend Frameworks的SMTP邮件传输类
  5. CodeIgniter的TTemplate类
  6. 一个整洁的蛋糕过滤器助手
  7. 关于为Symfony会话类使用析构函数的Google-Groups线程

有趣的是Kohana跟踪标签,以便以后可以通过"命名空间"删除(而不是仅仅清除缓存).因此,它使用析构函数将这些更改刷新到硬盘存储.

CodeIgniter类也做了一些有趣的事情,它将调试输出添加到析构函数中的输出流.我不是说这很好,但它是另一种用途的例子......

每当我在主控制器上运行很长时间时,我个人都会使用析构函数.在构造函数中,我检查一个pid文件.如果该文件存在(并且其进程仍在运行),则抛出异常.如果没有,我创建一个包含当前进程ID的文件.然后,在析构函数中删除该文件.因此,除了释放资源之外,更多的是清理自己...


Jan*_*roň 19

生成HTML页面还有另一个方便的用途

class HTMLgenerator {
  function __construct() {
    echo "<html><body>";
  }
  function __destruct() {
    echo "</body></html>";
  }
}
Run Code Online (Sandbox Code Playgroud)

有了这门课,你就可以写了

$html = new HTMLgenerator();
echo "Hello, world!";
Run Code Online (Sandbox Code Playgroud)

结果是

<html><body>Hello, world!</body></html>
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这应该在现实世界中使用,看起来像一个黑客.依赖于非常具体的用法.我只是将HTMLgenerator实现为在其构造函数中使用一些HTML,并覆盖toString方法.调用者可以简单地说`echo new HTMLGenerator()`.如果你使用这个_destructor echo模式,你最好只在一个地方使用它,或者你将在地狱中试图弄清楚什么时候会输出.简而言之,这是对功能的滥用. (9认同)
  • 我同意.这只是一个想法,它可能会在一些聪明的头脑中引用一些精彩的想法,所以让这个exot活着:-) (2认同)

VDV*_*eon 6

例如:

<?php
class Session
{
    protected $data = array();

    public function __construct()
    {
        // load session data from database or file
    }

    // get and set functions

    public function __destruct()
    {
        // store session data in database or file
    }
};
Run Code Online (Sandbox Code Playgroud)

这是一个很好的使用destruct的原因.您可以始终阻止对会话源的读取和写入,并且仅在开始和结束时执行此操作.