在PHP7中的foreach变化

10

foreach在PHP7中默认情况下,当按值迭代时,根据以下方式对数组的副本进行操作:http://php.net/manual/en/migration70.incompatible.php

它是否仅在对数组或值进行更改时惰性地创建副本,或者它总是会创建一个副本并实质上使循环引用成为性能优化?

此外,对象数组是否仍然循环遍历/提供对象的引用?还是它们实际上也会为foreach创建副本,并通过值返回对象?


根据这里的最佳答案,在PHP5中按值迭代时也会产生一个副本。 - Kenney
2
建议:只需迭代,不要试图通过“编写高效代码”来进行优化。大多数时间只需使用构造函数,让它们自行执行代码即可。只有在测量性能不可接受时才需要进行更改。(这不是回答或投票反对的原因,因为提出问题有学术原因,但这值得说明) - ircmaxell
@ircmaxell 这可以更简洁地表达:https://dev59.com/LHRC5IYBdhLWcg3wK96V - ivan_pozdeev
1个回答

14

在 PHP 7 中,如果按值迭代数组,则仅在实际修改数组时才会延迟执行复制操作。

相反,如果按引用迭代数组,则会在循环开始时执行分离操作。如果该数组目前在多个位置使用,则此分离将导致复制。

此外,按引用迭代意味着a)必须将数组包装为引用,b)每个元素也必须包装为引用。创建引用包装器是一个昂贵的操作,因为它需要进行分配。

此外,按引用迭代要求我们使用修改安全的迭代机制。这通过向数组注册迭代器并在各种数组修改操作中检查可能受影响的迭代器来实现。

因此,按引用迭代绝对不是优化,而是劣化。通常使用引用是优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接