2013-10-30 107 views
0

我有'文章'類與私有屬性words它擁有和Word類對象的數組。我也有getWord方法,它可以返回一個字:遍歷數組保存私有財產

class Article { 
    private $words = Array(1 => new Word(1), 2 => new Word(2), ...); 

    public function getWord($wordId) { 
     if (array_key_exists($wordId, $this->words)) { 
      return $this->words[$wordId]; 
     } else { 
      return NULL; 
     } 
    } 
} 

我需要通過所有exising單詞進行迭代。什麼是最好的方式來做到這一點?

目前我使用另一種方法將所有單詞作爲數組返回,但我認爲這不是一個好的選擇。

+0

是不是'$ wordId'在'$ words'數組中是唯一的(因爲它是鍵)? – Raptor

+1

你是什麼意思?你需要實現方法,它會返回所有現有的單詞嗎?如果是這樣,那麼爲什麼不用簡單的'return $ this-> words'呢? –

+0

@ShivanRaptor,是的,它是獨一無二的。 –

回答

1

如果你想遍歷一個Article對象,訪問所有Word對象,你應該實現要麼Iterator接口或IteratorAggregate

如果這樣做,迭代會,因爲這很容易:

foreach ($article as $word) { 
    // do stuff with Word object here 
} 

最簡單的方法是將您現有的getWords方法。你可以添加一個新的方法getIterator所要求的IteratorAggregate接口和實現它是這樣的:

public function getIterator() { 
    return new ArrayIterator($this->getWords()); 
} 

如果你想擺脫getWords(),你也可以直接通過內部數組。

+0

謝謝,我認爲這是我需要的。我會直接傳遞內部數組。你能告訴我在迭代方面返回迭代器而不是數組的優點是什麼? –

+0

因爲接口需要迭代器。如果你要求一個迭代器(如果對象實現了這個接口,PHP在foreach循環內部做),結果必須是一個迭代器對象。否則事情可能會破裂。 – Sven

1

您的解決方案是最好的,最乾淨的。面向私有屬性的getter被OOP廣泛接受。看到這個stackoverflow entry

吸氣看起來是這樣的:

public function getWords() { 
    return $this->words; 
} 

如果將所有的類都可以訪問和編輯屬性,您也可以把它的公共屬性。但正如我理解你的代碼,其他類和方法應該只能讀取這個屬性,所以getter是最好的解決方案。

如果你只是想揭露你的財產的一些特定的單詞對象,則此方法將如下所示:

public function getFilteredWords($param) { 
    $tmpWords = array(); 

    foreach($this->words as $w) { 
    if(/*word NOT matches your filter criteria ($param)*/) 
     continue; 

    $tmpWords[] = $w; 
    } 

    return $tmpWords; 
} 
+0

謝謝,但以這種方式我暴露了單詞的內部結構。創建一個變量來保存字數並在循環中使用它會不會更好? –

+0

使用什麼循環?我是否理解你正確地想要在另一個類的另一個方法中訪問Article類的$ words屬性(以及該屬性所持有的Word對象實例)? – TiMESPLiNTER

+0

是的,這是正確的。但我不想公開所有這些詞。 –