イテレータのどの実装私はPHPで使用する必要があり、その理由は?
-
21-08-2019 - |
質問
私は、大規模な、古いプロジェクトをリファクタリングしようとしていると私は気づいたことの一つは、異なるイテレータの実装の範囲であります
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にすべてをリファクタリングに傾いています。 イテレータのこれらの実装のいずれかに説得力の利点がある、またはそれは純粋に個人的な好みの問題ですか?
解決
SPLのバージョンは間違いなく行く方法です。だけでなく、それを読むことが最も簡単ですが、それは今でPHPの一部ですので、多くのより多くの人々によく知られています。
他の人と何も「間違っている」ありますが、あなたが述べたように、誰も助けていない一つのプロジェクトでは、これらすべての異なるバージョンを持っています。
他のヒント
インターフェイスは、フロントエンドでの使用にはあまり醜いなる傾向があるように芋、単にSPLライブラリーの一つ以上を利用します。しかし、実装の後ろの裏は少し醜い得ることができます。
要求されなかった結果が要求ポインタからフェッチされたことはありませんでしたように、たとえば、私は、効率的にデータベースの結果セットを反復イテレータを書き、アイテムが途中でフェッチされた場合(IE:$ OBJ [5])、それ内部バッファに必要なすべての結果を求めてしまいます。
は、あなたがちょうど彼らがあなたは、配列のように見えるものを使用し、それが失敗する可能性が「魔法」を行います見たとき、それは人々を混乱させるために舞台裏のマジックが失敗したことがないですそのコードを祈る、見事に働きました>マジックが絡んで燃焼人を得ました。だから、おそらくそれがどのように動作するか、それは明らかにし、慎重かつ賢明にそれを使用しています。
私の個人的な好みがあるため、
for( $object as $i => $v )
それのための表記法は、一般に、より一貫性および予測可能です。
for( $dbresult->iterator() as $i => $v ){
}
スタイルの表記は機能的に同一であるが、少なくともあなたはそれが表面にどのように動作するか少ない当て推量を持っています。