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;
        }
    }
}

我需要遍历所有现有的单词。最好的方法是什么?

目前我正在使用另一种方法将所有单词作为数组返回,但我认为这不是一个好的选择。

4

2 回答 2

1

您的解决方案是最好的最干净的解决方案。为私有属性制作 getter 在 OOP 中被广泛接受。请参阅此stackoverflow 条目

吸气剂看起来像这样:

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;
}
于 2013-10-30T07:49:02.727 回答
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(),你也可以直接传递内部数组。

于 2013-10-30T08:02:06.760 回答