문제
나는 구현하는 물건이 있습니다 ArrayAccess, 반복자 그리고 셀 수 있는. 이로 인해 완벽한 배열 마스킹이 생성됩니다. 오프셋으로 액세스 할 수 있습니다 ($object[foo]
), 나는 그것을 a에 던질 수있다 foreach
-루프 및 기타 많은 것들.
그러나 내가 할 수없는 것은 기본 배열 반복자 함수에주는 것입니다.next()
, reset()
, current()
, key()
), 반복자에서 필요한 방법을 구현했지만. PHP는 완고하게 멤버 변수를 반복하려고 시도하고 반복적 인 방법을 완전히 무시하는 것 같습니다.
나머지 어레이 트레이버링 기능에 객체를 연결하는 인터페이스가 있습니까, 아니면 내가 가진 것을 붙잡고 있습니까?
업데이트: 반복적 인 도구는 대답이 아닌 것 같습니다. 사용되는 동안 foreach
-Loops, 기본 배열 반복자 기능은 메소드를 호출하지 않습니다.
해결책
PHP의 최근 변경 사항은 표준 어레이 함수 (재설정, 다음 등)를 사용하여 배열 어레이어를 조작하는 것을 방지합니다.
곧 복원해야합니다.http://news.php.net/php.internals/42015
다른 팁
이 작업을 수행하는 한 가지 방법은 별도의 클래스에서 자신의 반복자를 정의한 다음 기본 반복기 대신 해당 새 반복기를 사용하도록 메인 클래스에 알려주는 것입니다.
class MyIterator implements Iterator {
public function key() {
//
}
public function rewind() {
//
}
// etc.
}
class MyMainClass implements IteratorAggregate {
private $_data = array();
// getIterator is required for the IteratorAggregate interface.
public function getIterator() {
return new MyIterator($this->_data);
}
// etc.
}
그런 다음 필요한만큼 통제 할 수 있어야합니다. (그리고 여러 수업에서 자신의 Myiterator를 재사용 할 수 있습니다).
위의 테스트는 수행되지 않았지만 원칙은 정확합니다.
도움이 되었기를 바랍니다!
~이다 어레이 시어터 당신이 찾고있는 것이 아닌가? 또는에 대해 ArrayObject, 이것은 당신이 달성하려는 것에 대한 SPL의 인터페이스 인 것 같습니다.