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 パターンを実装しようとしていて、「ビュー パーツ」を作成する必要があるとしましょう。それで、何が必要ですか?リクエストで生成されたすべての変数を取得する必要があり、(コントローラとモデルを介して) レスポンスで使用する準備ができたら、それらをビューにレンダリングする必要があります。1 つのアプローチ (もちろん、とりわけ) は、魔法のメソッド __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 に答える