2015-04-17 70 views
2

的情況:PHP鏈接方法,如何知道至極是最後一個

Class MyClass { 
    ... 
    public function method($args) { 
     // code 
     ... 
     if (is the last call) { 
      return $something; 
     } 
     return $this; 
    } 
    ... 
} 
.... 
$obj = new MyClass; 
$obj->method($some_args)->method($something_else)->method($more_data); 

我怎麼能知道的method最後調用實際上是最後一個?

+0

我不知道。你告訴我。什麼調用這個代碼? $ args是否告訴我們這是最後一遍?否則,您的支票可能需要在被調用的地方執行。 – ficuscr

+7

一般來說,函數應該*不負責知道這些信息。它們應該是自成一體的代碼,它可以很好地完成一件事情。在某個地方可能會有答案讓你開心,但它幾乎無疑會讓你的代碼變得更糟。 – riwalk

+0

Thankyou,那麼沒有一個真正的場景,所以$參數和其餘的代碼並不重要,這只是一個非常普遍的情況。我在爲一個研究小框架編碼時考慮過 – Lucabro

回答

3

當一個函數被調用時,它就在那個時候總是最後一次調用該函數。 PHP不知道你的腳本實際上是否會在該函數之後執行另一個函數調用。

那你很可能繞過使用__destruct神奇的功能,例如正在說:

<?php 

Class MyClass { 
    private $method_queue = array(); 

    public function method($args) { 
     array_push($this->method_queue, $args); 
     return $this; 
    } 

    private function _method($args, $is_last) { 
     // do actual stuff 
     echo $args; 

     if ($is_last) { 
      echo "LAST"; 
      // do more stuff 
     } 
    } 

    public function __destruct() 
    { 
     foreach ($this->method_queue as $k=>$args) { 
      $this->_method($args, count($this->method_queue)-1==$k); 
     } 
    } 
} 

$obj = new MyClass; 
$obj->method(1)->method(2)->method(3); 
+0

我討厭這是一個很整潔的解決方案,因爲它使用起來像是一個糟糕的主意;) – Trey

+0

確實,方法名稱可能更具描述性,但這完全取決於在使用場景中。我不認爲使用__destruct本身是一個不好的解決方案,我不知道他的問題的上下文是什麼。 –

+0

期望一種方法來了解調用它的上下文而不傳遞某些內容來定義上下文是一種不好的做法從我的觀點。我並不是說你的例子具體是一個壞主意,我的意思是說它的需要表明代碼可以更好地構建。 – Trey

相關問題