2012-09-18 94 views
3

我找到了下面的代碼。這是一種特定的模式還是可能是這樣構造代碼的原因 - 或者它只是假的?爲什麼邏輯在__destruct

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

什麼'InvoiceReport'包含哪些內容? – JamesHalsall

回答

1

我不會稱之爲所示代碼「邏輯」在析構函數:它實際上是Observer模式的實現。

我想在這裏它的工作原理類似:第一,創建一個CustomerReport對象時,它的構造函數會註冊一些觀察對象(可能與$this->exportCustomers方法,它的身體是不是這裏顯示的一些原因)在其$inst領域。然後每當這個對象的狀態改變時,這些觀察對象就會被通知。當然,這個對象的破壞也可以被看作是其狀態的改變。 )

0

這可能是因爲代碼不信任這部分用戶的原始開發商(可能是同一個人太( - :)這些庫,並希望確保創建的每個CustomerReport會做調用合作者對象(他們可以釋放一些鎖或其他關鍵資源)。

2

正如raina77ow說,是一個模式的實現。另外,你必須考慮你想一旦物體被破壞怎麼辦你的應用程序的生命週期。讓我們看看下面的例子(請,這只是一個例子!)

讓我們假設你正在試圖實現MVC模式,你是誰建議立即進行刪除的傢伙d製作「查看部分」。那麼你需要什麼?您需要獲取請求中生成的所有變量,一旦它們準備好用於響應(通過控制器和模型),它們應該被渲染到視圖中。一種方法(當然是其他方法)是通過魔術方法__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'); 
} 

這只是一個例子,順便說一句,非常verbosed(你可以在方法名看到)。但是這個例子背後的想法是,在對象被銷燬前綁定一些行爲

當然也有很多,你可以 - 和你應─實現這種模式的情況下,這只是解釋意義上使用這個神奇的方法的例子。

希望它能幫助!

相關問題