为什么__destruct中的逻辑

时间:2012-09-18 12:18:21

标签: php design-patterns

我找到了以下代码。这是一个特定的模式,或者可能是构造这样的代码的原因 - 还是仅仅是伪造的?

class ExportCSV extends Export
{
    // some private and public vars

    public function __construct($arg)
    {
    // [...]
        new CustomerReport($this);
    }

    public function procCallback($proc)
    {
        switch($proc){
            case "customer":
                new InvoiceReport($this);
                break;
            case "invoice":
                new PrepaymentReport($this);
                break;
            case "prepayment":
                new RefundReport($this);
                break;
            case "refund":
                $this->sendMail();
                break;
        }
    }
}

class CustomerReport extends Foobar
{
    private $inst;
    public function __construct($inst)
    {
        $this->inst = $inst;
        $this->exportCustomers($inst->from, $inst->to);
    }
    public function __destruct()
    {
        $this->inst->procCallback("customer");
    }
}

3 个答案:

答案 0 :(得分:2)

正如raina77ow所说,是一种模式的实现。此外,在应用程序生命周期中销毁对象后,您必须考虑要执行的操作。让我们考虑以下示例(请,它只是一个示例!)

让我们假设您正在尝试实现MVC模式,而您应该成为“查看部分”的人。那么你需要什么?你需要获取请求中生成的所有变量,一旦它们准备好在响应中使用(通过控制器和模型),它们应该被渲染到视图中。一种方法(当然,除此之外)是通过魔术方法__destruct()实现这种模式(Observer)。例如:

// your code here
public function __destruct() {
    $this->grabAllTheVarsAndRenderThem();
    // or you can include the views file
    extract($this->viewParams);
    include_once('my_file_view.php');
}

这只是一个例子,顺便说一句,非常详细(,你可以在方法名称中看到)。但是这个例子背后的想法是,在对象被销毁之前绑定一些行为

当然,在很多情况下你可以 - 而且你应该 - 实现这种模式,这只是一个例子来解释使用这种神奇方法的感觉。

希望它有所帮助!

答案 1 :(得分:1)

我不会在析构函数中调用显示的代码'Logic':它实际上是Observer模式的实现。

我假设它的工作方式如下:首先,当创建CustomerReport对象时,其构造函数将注册一些观察对象(可能使用$this->exportCustomers方法,由于某些原因,此处未显示该主体)在$inst字段中。每次更改此对象的状态时,将通知这些观察对象。当然,对这个物体的破坏也可以看作是改变它的状态。 )

答案 2 :(得分:0)

可能是这部分代码的原始开发人员不信任用户(也可能是这些库的同一个人( - :),并希望确保每个CustomerReport创建会调用协作者对象(他们可能会释放一些锁或其他关键资源)。