2013-10-30 2 views
0

클래스 개체를 보유하고있는 개인 속성 words이있는 '아티클'클래스가 있습니다. 나는 모든 exising 단어를 반복 할 필요가배열을 반복하여 전용 속성 내부에 보관

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

: 나는 또한 한 단어를 반환 할 수 있습니다 getWord 방법이있다. 그렇게하는 가장 좋은 방법은 무엇입니까?

현재 다른 방법을 사용하여 모든 단어를 배열로 반환하지만 좋은 옵션이라고 생각하지 않습니다.

+0

이 아닌가요 '$ wordId'는'$ words' 배열에서 고유합니다 (키처럼)? – Raptor

+1

무엇을 의미합니까? 기존의 모든 단어를 반환하는 메서드를 구현해야합니까? 그렇다면 왜 간단한 'return $ this-> words'로하지 않습니까? –

+0

@ShivanRaptor, 그렇습니다. –

답변

1

것은, 당신이 중 하나를 구현해야합니다 Iterator 인터페이스 또는 IteratorAggregate 이 작업이 완료되면

, 반복하는이만큼 쉬운 것입니다 :

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

가장 쉬운 방법은 기존 getWords 방법을 변환하는 것입니다. 당신은 IteratorAggregate 인터페이스로 필요 getIterator 새로운 방법을 추가하고이를 구현과 같이 수 :

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

당신이 getWords() 제거하려는 경우, 당신은 직접 내부 배열을 전달 할 수있다.

+0

감사합니다. 이것이 내가 필요한 것이라고 생각합니다. 내부 배열을 직접 전달합니다. 당신은 incapsulation 측면에서 배열 대신에 반복자를 반환하는 이점이 무엇인지 말해 줄 수 있습니까? –

+0

인터페이스 때문에 iterator가 필요합니다. 반복자를 요청하면 (객체가 해당 인터페이스를 구현하는 경우 PHP가 내부적으로 foreach 루프에서 수행함) 결과는 반복자 객체 여야합니다. 그렇지 않으면 일이 깨질 수 있습니다. – Sven

1

귀하의 솔루션이 가장 깨끗한 솔루션입니다. 개인 속성에 대한 getter 만들기는 OOP에서 널리 허용됩니다. 이 같은 게터 보이는이 stackoverflow entry

를 참조하십시오 : 당신은 모든 클래스에 액세스하고 속성을 편집 할 수있는 것이 있다면

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

당신은 또한 공용 속성 할 수 있습니다. 그러나 귀하의 코드를 이해하는 것처럼 다른 클래스와 메소드는이 속성에 대한 읽기 전용 액세스 권한을 가져야하므로 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; 
} 
+0

고마워,하지만 이런 식으로 나는 단어의 내부 구조를 폭로한다. 단어 개수를 유지하는 변수를 만들어 루프에서 사용하는 것이 더 좋지 않습니까? –

+0

루프를 사용 하시겠습니까? 다른 클래스의 다른 메서드에서 Article 클래스의 $ words 속성 (및이 속성이 보유하고있는 Word 개체 인스턴스)에 액세스하기를 원한다는 점을 이해 했습니까? – TiMESPLiNTER

+0

예, 맞습니다. 그러나 나는 그 모든 말을 폭로하고 싶지 않습니다. –

관련 문제