我有'Article'类,私有属性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;
}
}
}
我需要遍历所有的词汇。最好的方法是什么?
目前我正在使用其他方法将所有单词作为数组返回,但我不认为这是一个不错的选择。
答案 0 :(得分:1)
您的解决方案是最干净的解决方案。在OOP中广泛接受为私有属性制作getter。见stackoverflow entry
getter看起来像这样:
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;
}
答案 1 :(得分: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()
,你也可以直接传递内部数组。