迭代私有属性中的数组保持

时间:2013-10-30 07:44:26

标签: php

我有'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;
        }
    }
}

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

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

2 个答案:

答案 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(),你也可以直接传递内部数组。