Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Diskussion zum PHP-Quellcode 24: Analyse der Gründe, warum die Iteration nicht abgeschlossen werden kann, wenn der Wert in der Iteratorimplementierung falsch ist

Eine kurze Diskussion zum PHP-Quellcode 24: Analyse der Gründe, warum die Iteration nicht abgeschlossen werden kann, wenn der Wert in der Iteratorimplementierung falsch ist

不言
不言Original
2018-06-28 17:57:031311Durchsuche

Dieser Artikel stellt hauptsächlich die Analyse der Gründe vor, warum die Iteration nicht abgeschlossen werden kann, wenn der Wert in der Iteratorimplementierung falsch ist. Jetzt können Freunde in Not darauf zurückgreifen Sprechen Sie kurz über den PHP-Quellcode 24: Analyse der Gründe, warum die Iteration nicht abgeschlossen werden kann, wenn der Wert in der Iterator-Implementierung falsch ist

Im vorherigen Artikel gibt es einen Artikel über die einfache Implementierung des Iterators und des Yii-Frameworks ist eine einfache Iterator-Implementierung. Hier bleibt ein Problem bestehen. Wenn der Iterationswert false enthält, endet die foreach-Schleife an dieser Stelle.

Folgen Sie der Idee von Brother Bird und finden Sie relevante Hinweise in Zeile 8131 der Datei Zend/zend_vm_execute.h, wie im folgenden Code gezeigt:

 /*  */
 if (!iter || (iter->index > 0 && iter->funcs->valid(iter TSRMLS_CC) == FAILURE)) {
 /* reached end of iteration */
 if (EG(exception)) {
 array->refcount--;zval_ptr_dtor(&array);ZEND_VM_NEXT_OPCODE();}
 ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);}

Für den implementierten einfachen Iterator iter->funcs- > Die Methode ;valid(iter TSRMLS_CC) ruft die Methode valid() auf.

Wenn unser Wert falsch ist, ist der über current zurückgegebene Wert falsch, und wenn über foreach darauf zugegriffen wird, wird die Durchquerung hier unterbrochen, das Programm wird fortgesetzt um den folgenden Code anstelle dieser Schleife auszuführen

Lösung

Verarbeiten Sie den Schlüssel und den Wert im Array separat

In den Methoden valid(), rewind(), next() Bedienen Sie den Schlüssel anstelle des Werts
und nur Rückgabewert
im Strom, wie die einfache Implementierung von Iterator im Artikel und die Implementierung von Iterator im Yii-Framework, die Implementierung von CMapIterator im Yii-Framework

und höher. Das ist das Ganze Der Inhalt dieses Artikels wird für alle hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Eine kurze Diskussion des PHP-Quellcodes 23: Über die URL-Code-Funktion


Eine kurze Beschreibung Diskussion des PHP-Quellcodes 23 2: Über die Funktion array_splice

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion zum PHP-Quellcode 24: Analyse der Gründe, warum die Iteration nicht abgeschlossen werden kann, wenn der Wert in der Iteratorimplementierung falsch ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn