문제

수업이 있고 특정 배열 멤버를 반복 할 수 있기를 원합니다. 나는 빠른 검색을하고 발견했다 IteratorAggregate:

class foo implements IteratorAggregate
{
    protected $_array = array('foo'=>'bar', 'baz'=>'quux');

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

훌륭하게 작동하지만 새로운 것을 만들지는 않습니다. ArrayIterator 매번 인스턴스 foreach 그것에 사용됩니까?

그래서 반복자 인스턴스를 회원에 저장해야한다고 생각했습니다.

    protected $_iterator;

    public function getIterator()
    {
        if (!$this->_iterator instanceof ArrayIterator) {
            $this->_iterator = new ArrayIterator($this->_array);
        }
        return $this->_iterator;
    }

문제는 반복자가 사본을 사용한다는 것입니다. $this->_array 첫 번째 전화 중 getIterator(), 따라서 회원의 변경은 후속에 반영되지 않습니다. foreach 구성.

나는 서브 클래스를해야한다고 생각했다 ArrayIterator, 을 추가하다 setArray($array) 메소드를 반환하기 전에 호출하십시오 getIterator(), 그러나 나는 내부적으로 사용하는 배열의 멤버 이름과 서브 클래스로 덮어 쓰일 수 있는지 여부를 모른다.

문제는 : 이것이 조기 및/또는 불필요한 최적화입니까? 그렇지 않다면, 이것을 달성하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

두 번째 코드는 새 루프를 시작하기 전에 새 루프를 시작하는 객체의 여러 고리에서 실패합니다.

실제로 시간을 보내는 가치가있는 최적화처럼 보이지 않았습니다.

다른 팁

그러나 Foreach가 사용될 때마다 새 배열 인스턴스를 생성하지 않습니까?

예, 그리고?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top