2008-12-11 5 views
4

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

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, или это просто вопрос личного вкуса?

ответ

9

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

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

1

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

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

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

Магия заставила людей сгореть на костре. Поэтому используйте его тщательно и мудро, возможно, ясно, как это работает.

Мои личные предпочтения для обозначения

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

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

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

} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^