Какую реализацию Iterator мне использовать в PHP и почему? - PullRequest
4 голосов
/ 11 декабря 2008

Я пытаюсь реорганизовать большой, старый проект, и одна вещь, которую я заметил, это ряд различных реализаций Итератора:

while($iterator->moveNext()) {
    $item = $iterator->current();
    // do something with $item;
}   

for($iterator = getIterator(), $iterator->HasNext()) {
    $item = $iterator->Next();
    // do something with $item
}   

while($item = $iterator->fetch()) {
    // do something with item
}   

или даже StandardPHPLibrary (SPL) итератор, который позволяет

foreach($iterator as $item) {
    // do something with $item
}   

Наличие большого количества разных итераторов (с разными методами циклического перебора коллекций) кажется сильным запахом кода, и я склонен все реорганизовать в SPL. Есть ли неоспоримое преимущество любой из этих реализаций Iterator, или это просто вопрос личного вкуса?

Ответы [ 2 ]

9 голосов
/ 11 декабря 2008

SPL-версия определенно подходит. Это не только легче всего читать, но теперь оно является частью PHP, поэтому знакомо многим людям.

В этом нет ничего «плохого» с другими, но, как вы сказали, наличие всех этих разных версий в одном проекте никому не помогает.

1 голос
/ 11 декабря 2008

Imo, простое использование одной или нескольких библиотек SPL в качестве интерфейса имеет тенденцию быть менее уродливым в использовании во внешнем интерфейсе. Тем не менее, поддержка реализации может быть немного уродливой.

Например, я написал итератор, который эффективно итерировал набор результатов базы данных, так что результаты, которые никогда не запрашивались, никогда не выбирались из указателя запроса, а если элементы выбирались преждевременно (IE: $ obj [5]), он будет искать все необходимые результаты во внутренний буфер.

Прекрасно сработало, вы просто молитесь, чтобы код, который делает магию за сценой, никогда не подводил, потому что он смущает людей, когда они видят, что вы используете нечто, похожее на массив, и делает «магию», которая может дать сбой:

Волшебство поджигало людей на костре. Поэтому используйте его осторожно и с умом, возможно, сделайте очевидным, как это работает.

Мои личные предпочтения -

for( $object as $i => $v ) 

обозначения для него, как правило, более последовательны и предсказуемы.

for( $dbresult->iterator() as $i => $v ){ 

}

стиль обозначения функционально идентичен, но, по крайней мере, у вас меньше догадок о том, как он работает на поверхности.

...