Wie funktioniert PHP „foreach“ eigentlich?
In PHP ist die foreach-Anweisung ein Sprachkonstrukt, das zum Durchlaufen von Elementen eines verwendet wird Array oder ein durchquerbares Objekt. Die foreach-Schleife ist so konzipiert, dass sie vorhersehbar und effizient funktioniert, und sie hat zwischen PHP 5 und PHP 7 erhebliche Änderungen erfahren, um ihre Funktionalität und Leistung zu verbessern.
PHP 5
In PHP 5 verwendet die foreach-Anweisung einen internen Array-Zeiger (IAP), um die Iteration zu verfolgen und zu verwalten. Der IAP ist ein zentralisierter Mechanismus, der es mehreren foreach-Schleifen und anderen Funktionen ermöglicht, die mit dem Array interagieren, um ihre Operationen zu koordinieren.
Aufgrund der Verwendung eines gemeinsam genutzten IAP wies foreach in PHP 5 jedoch mehrere Einschränkungen auf:
-
Array-Duplikation: Wenn ein referenziertes Array nach Wert iteriert wurde, wurde das Array dupliziert Verhindern Sie, dass sich Änderungen während der Iteration auf das ursprüngliche Array auswirken (z. B. bei Verwendung von Funktionen wie reset(), every() usw.). Diese unnötige Duplizierung beeinträchtigte die Leistung.
-
Interferenz mit IAP: Änderungen am IAP durch Funktionen wie reset() hatten nicht immer Auswirkungen auf die foreach-Schleife. Dies könnte in bestimmten Szenarien zu unerwartetem Verhalten führen.
PHP 7
PHP 7 führte erhebliche Verbesserungen an der foreach-Implementierung ein. Die bemerkenswerteste Änderung ist die Einführung von externen Hashtabellen-Iteratoren, die den einzelnen IAP ersetzten.
-
Externe Hashtabellen: Jede foreach-Schleife verwaltet ihre eigene externe Hashtabelle Iterator. Dieser Iterator verfolgt die aktuelle Position und andere relevante Informationen innerhalb des Arrays oder Objekts, das iteriert wird. Dank dieser unabhängigen Iteratoren ändert die foreach-Schleife den IAP des zugrunde liegenden Arrays nicht mehr, wodurch die Interferenzprobleme beseitigt werden.
-
Keine Array-Duplizierung: In PHP 7 ist die Iteration von Arrays nach Wert nicht der Fall beinhalten Doppelarbeit. Wenn das Array während der Schleife geändert wird, wird es bei Bedarf geklont (nach dem Copy-on-Write-Mechanismus). Dies verbessert die Leistung im Vergleich zu den unnötigen Duplikaten von PHP 5 erheblich.
Auswirkungen auf das Verhalten
Die Änderungen in der foreach-Implementierung von PHP 7 haben zu mehreren Verhaltensunterschieden im Vergleich zu geführt PHP 5:
-
Array-Änderungen: In PHP 5 werden Änderungen an einem referenzierten Array während einer by-value-foreach-Schleife in der Schleife widergespiegelt. In PHP 7 wird die Iteration von Arrays nach Wert jedoch immer auf die ursprünglichen Elemente angewendet, unabhängig von Änderungen, die während der Schleife vorgenommen werden.
-
IAP-Änderungen: Änderungen am IAP mithilfe von Funktionen wie Zurücksetzen () wirkt sich nicht mehr direkt auf die foreach-Schleife in PHP 7 aus. foreach verwaltet seinen eigenen Iterator, der von externen Änderungen an der nicht betroffen ist IAP.
Nutzungsrichtlinien
Um eine optimale Nutzung sicherzustellen und potenzielle Probleme mit der foreach-Anweisung zu vermeiden, beachten Sie die folgenden Richtlinien:
- Bevorzugen Sie nach Möglichkeit die Iteration nach Wert. Dies vermeidet die Erstellung eines zusätzlichen Iterators und verbessert die Leistung.
- Beachten Sie die Verhaltensänderungen zwischen PHP 5 und PHP 7 in Bezug auf Array-Änderungen während der Iteration nach Wert.
- Seien Sie beim Ändern vorsichtig das Array oder Objekt, das während einer foreach-Schleife iteriert wird, da dies je nach den spezifischen Umständen zu unerwartetem Verhalten führen kann.
Das obige ist der detaillierte Inhalt vonWie funktioniert die „foreach'-Schleife von PHP in PHP 5 und PHP 7 unterschiedlich?. 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