foreach
在PHP7中默认情况下,当按值迭代时,根据以下方式对数组的副本进行操作:http://php.net/manual/en/migration70.incompatible.php
它是否仅在对数组或值进行更改时惰性地创建副本,或者它总是会创建一个副本并实质上使循环引用成为性能优化?
此外,对象数组是否仍然循环遍历/提供对象的引用?还是它们实际上也会为foreach
创建副本,并通过值返回对象?
foreach
在PHP7中默认情况下,当按值迭代时,根据以下方式对数组的副本进行操作:http://php.net/manual/en/migration70.incompatible.php
它是否仅在对数组或值进行更改时惰性地创建副本,或者它总是会创建一个副本并实质上使循环引用成为性能优化?
此外,对象数组是否仍然循环遍历/提供对象的引用?还是它们实际上也会为foreach
创建副本,并通过值返回对象?
在 PHP 7 中,如果按值迭代数组,则仅在实际修改数组时才会延迟执行复制操作。
相反,如果按引用迭代数组,则会在循环开始时执行分离操作。如果该数组目前在多个位置使用,则此分离将导致复制。
此外,按引用迭代意味着a)必须将数组包装为引用,b)每个元素也必须包装为引用。创建引用包装器是一个昂贵的操作,因为它需要进行分配。
此外,按引用迭代要求我们使用修改安全的迭代机制。这通过向数组注册迭代器并在各种数组修改操作中检查可能受影响的迭代器来实现。
因此,按引用迭代绝对不是优化,而是劣化。通常使用引用是优化。