PHP 在将数组子集分配给变量时是否复制数组子集?

问题描述 投票:0回答:1

考虑一个具有许多键的大数组

$stats
,其中一个是“访问者”,具有大数组作为值。

PHP 在编写时会做什么

$visitors = $stats['visitors']
- 它会复制数组结构和值还是仅使用对原始数组的引用?

我应该使用

$visitors = &$stats['visitors']
来代替吗?

数据仅被读取。

我知道 PHP 在将数组传递给方法或将变量分配给变量时使用写入时复制,但是 CoW 也可以在我的场景中使用数组子集工作吗?

php arrays memory-management copy-on-write
1个回答
0
投票

考虑一个具有许多键的大型数组 $stats,其中一个是“访问者”,具有大型数组作为值。

描述暗示了您问题的答案。您已经正确地注意到 PHP 数组中的值只是独立的值 - 您无需执行任何特殊操作即可使数组成为多维数组,只需将一个数组作为另一个数组中的值即可。

这个问题的答案...

PHP 写

$visitors = $stats['visitors']
时会做什么?

...因此与此问题的答案完全相同:

PHP 写

$visitors = $some_visitors
时会做什么?

唯一重要的是右侧的。就您而言,您分配的值是一个大数组;事实上,您从另一个数组中的项目复制它并没有任何区别。

它复制数组结构和值还是仅使用对原始数组的引用?

正如你所说,PHP 对数组使用写时复制:变量将指向已包含大数组的同一内存,并且其引用计数将增加。只有当其中一个“副本”需要修改时,才会在内存中实际创建一个新副本。

我应该使用 $visitors = &$stats['visitors'] 来代替吗?

几乎肯定不会。事实上,这样做可能会使情况变得“更糟”,因为引用破坏了优化代码所依赖的一些假设。在 PHP 7 之前,这样做将立即需要以前使用写时复制的任何内容的单独副本;现在情况已不再是这样了(请阅读这篇博文,了解有关更改内容的大量技术细节),但您仍然不太可能通过引用做出任何更好的事情,除非您实际上正在向数组写入

© www.soinside.com 2019 - 2024. All rights reserved.