2011-08-11 72 views
2

好的,夥計們。下面是我一直在想的事情:PHP5中的鏈接方法

因爲可以在PHP5中鏈接方法,所以我想知道是否有可能通過智能的方式更深入地理解概念,以確定方法是否是最後一個要執行的鏈 - 並且不使用名爲getResult()的第三種方法?

普通方法調用:

$myClass->dofirst(); // Data is returned from the dofirst-method 

我想;

$myclass->dofirst()->sortOutputfromDofirstAndReturn(); 

的想法是,在第二方法中,sortOutputfromDofirstAndReturn()將防止dofirst()方法從返回,而是執行第二方法中所述的邏輯,而無需第三方法反彈回給用戶。

也許有點混亂,所以讓我知道我是否需要澄清任何事情!

+1

這是不可能的,只有更多鈔票。 –

+2

什麼? 'sortOutputFromDOfirstAndReturn'只能在*'dofirst'返回後被調用,否則你首先不會有任何對象調用任何東西。既然'dofirst'已經回來了,世界上的任何東西會如何阻止它回溯?另外,爲什麼你要在地球上做這個? – tdammers

回答

0

有幾種可能性:

添加一個(或幾個特殊)方法(參見Doctrien 1.2),該結束鏈(execute是特殊的)

$q = new Doctrine_Query(); 
$q->select('Foo')->where('bar = 1')->orderBy('bar')->execute(); 

如果最後的結果是始終狀物體比陣列您可以使用Your chain邏輯實現Iterator接口。

class Chain implements Iterator { /* implementation */ } 
$c = new Chain(); 
foreach ($c->first()->second() as $item) { /* do stuff */ } 

半愚蠢的一個。如果您的結果是字符串,比重新實現__toString方法...

0

doFirst()必須返回一些東西(具體來說,一個對象),使其有資格進行鏈接。 sortOutputfromDofirstAndReturn()doFirst()返回的對象進行操作,所以doFirst()應該返回這樣的:

public function doFirst() { 
    // snip 
    return $this; 
} 

因此,最後的方法(sortOutputfromDofirstAndReturn()在這種情況下),可也不應該阻止鏈以前的方法無法返回。然而,開發人員需要確保那些較早的方法返回一個對象(而不是輸出或其他數據)。

1

如果我理解正確的問題,那麼這將工作。我一直稱這是一個流暢的界面,但我不知道這是否是正確的名稱。基本上它通過在每個方法的結尾處​​返回它來工作,如下面的例子。

class Foo { 
    public function doFirst() { 
     $this->bar = array('b', 'c', 'a'); 
     return $this; 
    } 

    public function sortOutputfromDofirstAndReturn() { 
     sort($this->bar); 
     return $this; 
    } 

} 
0

你基本上,如果你能在前面的一個傳遞到下一個它的數據,而「迴歸」鏈方法要求。考慮到你只在對象上鍊接方法,並且不會從任何東西中捕獲任何返回值,而是調用最後一個方法(如果鏈接應該返回對已有對象的另一個引用),它就已經這樣做了。如果dofirst()返回一些永遠不會看到的值,這並不重要。這裏沒有提升性能。

編輯

我想我誤解你的問題,你表明你理解方法鏈接。你所問的只是返回它們所屬對象的函數。當您致電$myclass->dofirst()時,您只需調用$myclass對象的dofirst函數。如果你想鏈接一個方法,你需要dofirst再次返回對象,以便可以調用另一個函數。

class MyClass{ 

    function dofirst() 
    { 
     // do something 
     return $this; // return the object you were calling this function on 
    } 
} 

如果你現在看的代碼將如何執行,$myclass->dofirst()將回到$myclass一個參考,你會然後調用sortOutputfromDofirstAndReturn()在鏈:$myclass->dofirst()->sortOutputfromDofirstAndReturn();

查看工廠模式以查看方法鏈接在哪裏使用很多的示例。

1

方法調用是按順序執行的,你必須返回一個對象,以便你可以調用一個方法。如果dofirst()返回明文數據,這是不可能的。

0

我不是100%確定你在問什麼;如果你想要第二個「排序」功能做一些與doFirst的輸出,你爲什麼不只是使用

$myclass->sortOutputfromDofirstAndReturn(dofirst());

而且已經doFirst()返回的東西?正如其他人所說,doFirst必須返回$this或對象才能正常工作。如果我正確閱讀,您只想使用方法2來操作方法1應該返回的內容。

1

我認爲,如果數據是字符串,用魔術方法

class MyClass{ 
    public function __toString(){ 
    return $this->data; 
    } 
    public function dofirst(){ 
    $this->data='Hello'; 
    return $this; 
    } 
    public function sort(){ 
    $this->data.=' World'; 
    return $this; 
    }  
} 

$obj = new MyClass; 
echo $obj->dofirst(); //Hello 
echo $obj->dofirst()->sort(); //Hello world