2017-03-05 21 views
1

說我有下面的類:如何在PHP中使用方法鏈接時返回函數值?

class Test 
{ 

    private static $instance = false; 

    public static function test() 
    { 
     if(!self::$instance) 
     { 
      self::$instance = new self(); 
     } 
     return self::$instance; 
    } 

    public function test1() 
    { 
     //... 
    } 

    public function test2() 
    { 
     //... 
    } 

} 

我去調用函數被串聯起來,就像這樣:

$data = Test::test(...)->test1(...)->test2(...); 

目前爲上述方法鏈工作,我有回頭率$instance我真的很想,如果我可以從test2()返回一些東西,然後被分配到$data,但我不知道如何做到這一點,因爲我必須繼續返回$instance爲了讓mt方法鏈工作?

+1

你必須選擇:要麼你返回的對象,以便您可以鏈接,或返回一個值。你不能兩個都做。 – jeroen

回答

1

如果您想要鏈接方法,您需要從任何方法中返回當前實例,該方法之後有另一個鏈接的調用。但是,鏈中的最後一次呼叫沒有必要這樣做。在這種情況下,這意味着你可以自由地返回你喜歡的任何東西test2()

請記住,如果你返回與test2()不同的東西,你將永遠無法將任何東西鏈接到它上面。例如,$data = Test::test(...)->test2(...)->test1(...);不起作用。
Protip:它是值得記錄您的代碼與一些意見解釋哪些是和不可鏈式的,所以你不會忘記將來。

0

return $this裏面test1()test2()方法。

1

一般來說,如果你正在做方法鏈,並且我假設上面的每個測試都以不同的狀態返回你的數據模型,並且我假設你需要模型本身的一些數據。我會做到以下幾點:

class Test 
{ 
    private static $model; 

    public function test1() { 
     //do something to model 
     return $this; 
    } 

    public function test1() { 
     //do something to model 
     return $this; 
    } 

    public function finish_process() { 
     //process results 
     return $this.model; 
    } 
} 

所以基本上我可以做現在以下:

$results = Test::test1()->finish_process(); 

$results = Test::test1()->test2()->finish_process(); 
1

您可以通過其引用傳遞$數據,你可以改變它或將任何數據分配給它。

// inside class 

public function test2(&$data) { 
    $data = 'it will work'; 
} 

// outside class 
$data = ''; 
Test::test(...)->test1(...)->test2($data); 

檢查這個http://php.net/manual/en/language.references.pass.php