Php 迭代私有属性内的数组保持
我有一个带有私有属性Php 迭代私有属性内的数组保持,php,Php,我有一个带有私有属性words的“Article”类,它包含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))
words
的“Article”类,它包含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;
}
}
}
我需要遍历所有现有的单词。最好的方法是什么
目前,我使用另一种方法将所有单词作为数组返回,但我认为这不是一个好的选择。您的解决方案是最好的,也是最干净的。为私有属性生成getter在OOP中被广泛接受。看到这个了吗 getter如下所示:
public function getWords() {
return $this->words;
}
public function getIterator() {
return new ArrayIterator($this->getWords());
}
如果希望每个类都可以访问和编辑该属性,还可以将其设置为公共属性。但据我所知,您的代码中的其他类和方法应该具有对该属性的只读访问权限,因此getter是最终的最佳解决方案
如果只想公开属性的某些特定word对象,则该方法如下所示:
public function getFilteredWords($param) {
$tmpWords = array();
foreach($this->words as $w) {
if(/*word NOT matches your filter criteria ($param)*/)
continue;
$tmpWords[] = $w;
}
return $tmpWords;
}
如果您想迭代一个Article对象,访问所有Word对象,您应该实现接口或 如果完成此操作,迭代将非常简单:
foreach ($article as $word) {
// do stuff with Word object here
}
最简单的方法是转换现有的getWords
方法。您可以根据IteratorAggregate
接口的要求添加一个新方法getIterator
,并按如下方式实现它:
public function getWords() {
return $this->words;
}
public function getIterator() {
return new ArrayIterator($this->getWords());
}
如果你想摆脱
getWords()
,你也可以直接传递内部数组。是不是$wordId
在$words
数组中是唯一的(因为它是键)?你是什么意思?是否需要实现将返回所有现有单词的方法?如果是这样,那么为什么不使用simplereturn$this->words
?@ShivanRaptor,是的,它是独一无二的。@AlmaDoMundo,这正是我现在所做的,我认为这不是一个好的选择。谢谢,但通过这种方式,我揭示了单词的内部结构。创建一个包含字数的变量并在循环中使用不是更好吗?在循环中使用什么?我是否知道您是否正确希望在另一个类的另一个方法中访问您的文章类的$words属性(以及该属性所包含的Word对象实例)?是的,这是正确的。但我不想公开所有这些单词。好吧,那么你必须创建一个getSomeWords()方法,在其中迭代$words属性,将要公开的单词对象放在一个临时数组中,然后返回这个数组。你可能会添加一个FilterIterator对象并返回它,而不是纯ArrayIterator。谢谢,我想这就是我需要的。我将直接传递内部数组。您能告诉我,返回迭代器而不是数组在封装方面有什么好处吗?迭代器是需要的,因为接口。如果您请求一个迭代器(如果对象实现了该接口,PHP会在foreach循环中进行内部操作),那么结果必须是一个迭代器对象。否则事情可能会破裂。