3

我找到了以下代码。这是一种特定的模式,还是像这样构建代码的原因 - 还是只是假的?

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");
    }
}
4

3 回答 3

2

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

假设您正在尝试实现 MVC 模式,并且您是应该制作“视图部分”的人。那么你需要什么?您需要获取请求中生成的所有变量,一旦它们准备好在响应中使用(通过控制器和模型),它们应该被呈现到视图中。一种方法(当然还有其他方法)是通过魔术方法 __destruct() 实现此模式(观察者)。例如这样的:

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

这只是一个示例,顺便说一句,非常冗长(如您在方法名称中所见)。但是这个例子背后的想法是,在对象被销毁之前绑定一些行为

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

希望能帮助到你!

于 2012-09-18T12:42:22.597 回答
1

我不会在析构函数中调用显示的代码“逻辑”:它实际上是观察者模式的实现。

我在这里假设它是这样工作的:首先,当一个CustomerReport对象被创建时,它的构造函数将在其字段中注册一些观察对象(可能使用$this->exportCustomers方法,由于某些原因这里没有显示该主体) 。$inst然后每次这个对象的状态发生变化时,这些观察对象都会得到通知。而且,当然,这个对象的破坏也可以看作是改变它的状态。)

于 2012-09-18T12:20:54.227 回答
0

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

于 2012-09-18T12:24:25.997 回答