考虑具有许多键的大数组$stats
,其中一个键是具有大数组作为值的"访问者".
PHP在编写$visitors = $stats['visitors']
时会做什么-它是复制数组 struct 和值还是只使用对原始数组的引用?
我应该使用$visitors = &$stats['visitors']
吗?
仅读取数据.
我知道PHP在将数组传递给方法或将变量分配给变量时使用写时复制,但CoW在我的情况下也适用于数组子集吗?
考虑具有许多键的大数组$stats
,其中一个键是具有大数组作为值的"访问者".
PHP在编写$visitors = $stats['visitors']
时会做什么-它是复制数组 struct 和值还是只使用对原始数组的引用?
我应该使用$visitors = &$stats['visitors']
吗?
仅读取数据.
我知道PHP在将数组传递给方法或将变量分配给变量时使用写时复制,但CoW在我的情况下也适用于数组子集吗?
考虑一个具有许多键的大数组$stats,其中一个键是"访问者",其值为大array.
该描述暗示了您问题的答案.您已经正确地注意到,PHP数组中的值只是独立的值-您不必做任何特殊的事情来使数组多维化,只需将一个数组作为值放入另一个数组中即可.
这个的答案.
编写
$visitors = $stats['visitors']
时,PHP做什么?
...因此与对此的答案完全相同:
编写
$visitors = $some_visitors
时,PHP做什么?
唯一重要的是右手边的value.在您的情况下,您所分配的值是一个大数组;您只是碰巧知道在哪里可以找到该大数组值作为另一个数组中的一个项.
它是复制数组 struct 和值还是只使用对原始数组的引用?
正如您正确所说,PHP对数组使用写时复制:变量将指向已经包含大数组的同一内存,并且其引用计数将增加.只有当其中一个"副本"需要修改时,才会在内存中真正创建新副本.
我是否应该使用$vitors =$stats ' vitors ']?
几乎肯定不是.事实上,这样做可能会使其成为worse,因为引用打破了优化代码所依赖的一些假设.在PHP 7之前,这样做将立即需要之前使用写时复制的任何内容的单独副本;情况不再是这样了(阅读this blog post以了解有关发生变化的大量技术细节)但您仍然不太可能通过参考文献得出任何better,除非您实际上是数组的writing.