PHP-объекты как искусственные массивы - PullRequest
1 голос
/ 25 ноября 2008

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 25 ноября 2008

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

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

3 голосов
/ 25 ноября 2008

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

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 в нескольких классах).

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

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

0 голосов
/ 25 ноября 2008

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

...