Выше это красиво и компактно, но мне это кажется грязным, поскольку я никогда не использую $ key или $ value.
Вы не показали внутренности getContextIterator()
, поэтому трудно сделать конкретные предложения. Как правило, в PHP можно создавать объекты с возможностью итерации, реализуя OuterIterator
взаимодействия или просто реализуя Iterator
интерфейс . Оба интерфейса предопределены, и вы можете использовать свой объект с next()
, foreach
и т. Д.
Полагаю, вы реализовали что-то , например OuterIterator
. Если вы внедрите OuterIterator
вместо этого, вы получите некоторое преимущество в скорости AFAIK.
Используете ли вы итератор излишним?
Нет, не скажу так. Итераторы очень хороши для коллекций, так как вы сказали, что они есть. Я просто изменил бы его на итератор SPL.
Кроме того, должен ли итератор когда-либо изменять состояние / содержимое объекта, который он итерирует?
Ну, на самом деле каждый итератор делает это, по крайней мере, для внутреннего указателя итерации. Но я думаю, что это не твоя забота, но, возможно, уже светлее.
Так что даже для "большего" изменения внутри объекта, который вы перебираете, совершенно нормально, что он изменяется, пока ясно, что он делает. Контрпример: если вы перебираете массив и он будет перетасовывать элементы каждый раз, когда итерация идет на шаг вперед, это не будет полезно.
Но есть и другие случаи, когда это полностью допустимо и полезно. Так что решайте, что сделано, а не по общему правилу.