2012-01-10 111 views
1

方法鏈我遇到了很多在PHP方法鏈的例子,但找不到任何關於這個事情,所以我尋求幫助你們;)沒有最終的方法

我的問題是 - 可以我以某種方式查明鏈中的方法是否是最後一個?在大多數情況下,人們正在使用某種最終方法(執行,發送,...)來告知鏈的何時結束並返回相應的結果。但是我想知道是否有一些隱藏的魔法方法或技術可以檢查鏈中的所有方法並檢測是否沒有下一個方法? 沒有最終的方法它工作正常的字符串(在非常簡單的例子),但不是如果我想返回數組。

這裏是我的代碼片段:

class Chain { 
    private $strArray; 

    function __call($name, $args) { 
     $this->strArray[] = $args[0]; 
     return $this; 
    } 
    function __toString() { 
     return implode('-', $this->strArray); 
    } 
} 
// example 1 
$c = new Chain(); 
$x = $c->foo('hi')->bar('stack'); // need array('hi', 'stack') 

// example 2 
$c = new Chain(); 
$x = $c->foo('hi')->bar('stack')->foobar('overflow'); // need array('hi', 'stack', 'overflow') 

// example 3 
$c = new Chain(); 
echo $c->foo('hi')->foobar('overflow'); // prints 'hi-overflow' 

// example 4 
$c = new Chain(); 
echo $c->foo('hi')->bar('stack')->foobar('overflow'); // prints 'hi-stack-overflow' 

你看,當我要打印鏈的結果,我可以在__toString法修改的結果,但如果我需要一個陣列(例如1, 2)?有沒有什麼辦法可以實現,而不需要調用一些額外的「最終」方法?

非常感謝您的幫助,如果您需要更多信息,請告知我。

編輯:從@bandi反饋後,我試圖擴展ArrayObject這樣。

class Chain extends ArrayObject { 
    function __call($name, $args) { 
     $this->append($args[0]); 
     return $this; 
    } 
    function __toString() { 
     return implode('-', $this->getIterator()->getArrayCopy()); 
    } 
} 
// returned ref. to object, works fine in loop or accessing offset 
$obj = new Chain; 
$x = $obj->foo('hi')->bar('stack')->foobar('overflow'); // need array('hi', 'stack', 'overflow') 
foreach ($x as $y) { 
    echo $y, "\n"; 
} 
var_dump($x[0], $x[1], $x[2]); 

// returned String 
$c = new Chain; 
echo $c->foo('hi')->foobar('overflow'); // prints 'hi-overflow' 

它做什麼,我想,但我不覺得對$this->getIterator()->getArrayCopy()部分那麼好。有沒有一些簡單的方式來訪問數組(內部在["storage":"ArrayObject":private])? 謝謝

回答

0

方法鏈接是使用函數的返回值,在這種情況下,這是對對象的引用。預測返回值的使用通常是不可能的。

你必須告訴被調用的方法你想做一些不同的事情。您可以爲此使用第二個參數,例如如果定義了第二個參數,則返回不同的結果。另一個選項可能是修改該類,使其行爲像一個數組,除非它被打印。

+0

好的,謝謝。一般來說,我想在賦值給變量時返回數組,但仍然有打開選項來轉換爲字符串。當我返回$這我沒有得到類屬性($ strArray),但整個引用類,這是不希望的,它迫使我實施「最後」的方法。但是,如你所建議的那樣,最簡單的方法是將第二個參數TRUE傳遞給鏈中的最後一個方法。我會看看是否會有更多的建議;) – lp1051 2012-01-10 11:46:35

+0

btw。你是怎麼意思的 - 「另一種選擇可能是修改類,使其行爲像一個數組,除非它被打印。」?我不確定我是否理解 – lp1051 2012-01-10 12:09:08

+0

@ lp1051在新版本中,我不完全熟悉php的類系統,所以我不知道它是否可行:我的意思是你從'數組'類中派生出你的類並且然後添加您的兩個自定義方法。 – bandi 2012-01-11 12:12:43

相關問題