Wenn ein Iterator teilweise oder vollständig durchquert wurde, gibt es die verbleibende Anzahl von Elementen oder 0 zurück.
Fehlerbeispiel:
<span><span><span class="hljs-variable">$it</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">ArrayIterator</span></span><span>([</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>]);
</span><span><span class="hljs-variable">$it</span></span><span>-></span><span><span class="hljs-title function_ invoke__">next</span></span><span>(); </span><span><span class="hljs-comment">// Einen Schritt bewegen</span></span><span>
</span><span><span class="hljs-variable">$count</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iterator_count</span></span><span>(</span><span><span class="hljs-variable">$it</span></span><span>); </span><span><span class="hljs-comment">// zurückkehren 3 Stattdessen 4</span></span><span>
</span></span>
Lösung:
Setzen Sie den Iterator vor, bevor Sie Iterator_Count () aufrufen:
<span><span><span class="hljs-variable">$it</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">ArrayIterator</span></span><span>([</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>]);
</span><span><span class="hljs-variable">$it</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rewind</span></span><span>(); </span><span><span class="hljs-comment">// Zeiger zurücksetzen</span></span><span>
</span><span><span class="hljs-variable">$count</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iterator_count</span></span><span>(</span><span><span class="hljs-variable">$it</span></span><span>); </span><span><span class="hljs-comment">// zurückkehren 4</span></span><span>
</span></span>
Iterator_Count () durchquert den Iterator vollständig. Wenn der Datensatz riesig ist oder der Iterator eine komplexe Logik enthält, kann dies zu ernsthaften Leistungsproblemen führen.
Beispiel:
<span><span><span class="hljs-variable">$it</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InfiniteIterator</span></span><span>(</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">ArrayIterator</span></span><span>([</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>]));
</span><span><span class="hljs-variable">$count</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iterator_count</span></span><span>(</span><span><span class="hljs-variable">$it</span></span><span>); </span><span><span class="hljs-comment">// Es wird niemals enden</span></span><span>
</span></span>
Lösung:
Verwenden Sie nur für begrenzte, bekannte Datenbereiche.
Vermeiden Sie direkte Anrufe in unendlichen oder großen Datenstrukturen.
Erwägen Sie die Implementierung der benutzerdefinierten Zähllogik.
Stellen Sie sicher, dass der Iterator vor dem Gebrauch nicht teilweise durchquert wird , oder setzen Sie den Zeiger über Rewind () zurück.
Vermeiden Sie es , Iterator_Count () direkt für nicht reversbare Iteratoren (wie Generatoren) anzurufen . Sie können iterator_to_array () verwenden, um es vor dem Zählen zu konvertieren.
Vermeiden Sie es, diese Funktion auf unendlichen oder hochverbrauchten Iteratoren aufzunehmen , und bewerten Sie zunächst die Ausführungskosten.
Schreiben Sie den Testcode, um das Verhalten zu überprüfen , insbesondere für nachgeschöpfbare Typ-Objekte, die von Bibliotheken von Drittanbietern zurückgegeben wurden.