Вопрос

У меня есть объект, который реализует ArrayAccess , Итератор и Счетный . Это приводит к почти идеальному маскированию массива. Я могу получить к нему доступ со смещением ( $ object [foo] ), я могу добавить его в < code> foreach -loop и многие другие.

Но я не могу передать его функциям итератора собственного массива ( next () , reset () , current () , key () ), хотя я реализовал необходимые методы из Iterator. PHP, кажется, упорно пытается перебрать свои переменные-члены, а также полностью игнорирует итератор-методу.

Есть ли интерфейс, который бы связывал объект с остальными функциями обхода массива, или я застрял с тем, что у меня есть?

Update: IteratorAggregate, похоже, тоже не является ответом. Хотя он используется в foreach -loops, базовые функции итератора массива не вызывают методы.

Это было полезно?

Решение

Последние изменения в PHP не позволяют манипулировать формой ArrayIterators с использованием стандартных функций массива (сброс, следующий и т. д.).

Это должно быть восстановлено в ближайшее время: http://news.php.net/php.internals/42015

Другие советы

Один из способов заставить это работать - определить свой собственный итератор в отдельном классе, а затем указать своему основному классу использовать этот новый итератор вместо стандартного.

class MyIterator implements Iterator {
  public function key() {
    //
  }

  public function rewind() {
    //
  }

  // etc.

}

class MyMainClass implements IteratorAggregate {
  private 

Один из способов заставить это работать - определить свой собственный итератор в отдельном классе, а затем указать своему основному классу использовать этот новый итератор вместо стандартного.

<*>

Тогда вы должны иметь столько контроля, сколько вам нужно. (И вы можете использовать свой собственный MyIterator в нескольких классах).

Тестирование выше не проводилось, но принцип верен, я считаю.

Надеюсь, это поможет!

data = array(); // getIterator is required for the IteratorAggregate interface. public function getIterator() { return new MyIterator($this->_data); } // etc. }

Тогда вы должны иметь столько контроля, сколько вам нужно. (И вы можете использовать свой собственный MyIterator в нескольких классах).

Тестирование выше не проводилось, но принцип верен, я считаю.

Надеюсь, это поможет!

ArrayIterator не то, что вы ищете за? Или как насчет ArrayObject , который выглядит как интерфейс SPL за то, что вы пытаетесь достичь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top