PHP-объекты как искусственные массивы
Вопрос
У меня есть объект, который реализует 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 за то, что вы пытаетесь достичь.