Итераторы - стандартная форма работы со списковыми данными. Грубо говоря, под итератором можно понимать просто массив или массив массивов (очень условно).
Итератор обычно содержит следующие методы:
Обычная форма работы с итератором выглядит так:
for($iterator->rewind(); $iterator->valid(); $iterator->next()) { $item = $iterator->current(); [..do something with $item..] }
или в сокращенной форме:
foreach($iterator as $item) { [..do something with $item..] }
В PHP5 интерфейсы Iterator, Traversable, Countable и ArrayAccess являются уже встроенными и входят в библиотеку SPL (StandardPHPLibrary). Есть хорошая статья-введение в SPL на sitepoint.com от Harry Fuecks.
Однако базовых интерфейсов нам показалось мало, и мы расширили Iterator до интерфейса lmbCollectionInterface:
Пакет CORE содержит следующий набор интфейсов и классов для работы с итераторами:
Класс/Интерфейс | Назначение |
---|---|
lmbCollectionInterface | Интерфейс для работы с итераторами, который применяется в Limb |
lmbCollection | Класс, реализующий lmbCollectionInterface. По-сути объектная форма массива ассоциативных массивов |
lmbCollectionDecorator | Базовый декоратор на итератор с интерфейсом lmbCollectionInterface. |
Единичные (несписковые) контейнеры данных можно представлять как обычный ассоциативный массив в объектной форме. На самом деле все не так просто…
SPL содержит интерфейс ArrayAccess, который позволяет работать с классами, как с обычными массивами. Однако из-за того, что в Limb3 работа преимущественно ведется с объектами, мы решили, что было неплохо иметь возможность работать наоборот - с массивами как с объектами. Результатом этого появился интерфейс lmbSetInterface и класс lmbSet.
Важным классом также является lmbObject, который используется в качестве базового для объектов модели. lmbObject используется в пакете ACTIVE_RECORD в качестве родительского lmbActiveRecord. lmbObject вносит достаточно много «магии» в ваш код, поэтому его использование может как увеличить гибкость вашего кода и его наглядность, так и отнять у вас много времени на отладку, если этой «магией» неправильно пользоваться.
Класс/Интерфейс | Назначение |
---|---|
lmbSetInterface | Интерфейс для работы с единичными контейнерами данных |
lmbSet | Класс, реализующий lmbSetInterface. По-сути объектная форма ассоциативного массива |
lmbObject | Базовый класс, для объектов модели в Limb3. lmbObject поддерживает магические getter()-ы и setter()ы и реализует lmbSetInterface. |
if(isset($item['some_property'])) echo $item['some_property'];
можно просто написать
echo $item->get('some_property').
и пусть $item сам разбирается, есть у него такая some_property или нет.
А при использовании lmbObject-а в качестве $item из вышестоящего примера с методом getSomeProperty() будет вызван именно этот метод.
Обсуждение