php - PHP:在数组中存储数组似乎是在创建副本
问题描述
这是一个如此基本的问题,但我无法在任何地方找到明确的答案。据我了解,将对象存储在数组中应该存储引用,而不是副本......因此,当您通过数组访问对象时,您随后对对象所做的任何更改都应该是可见的。
在搜索这个主题时,我遇到了很多问题,询问如何将对象的副本存储在数组中,这样就不会发生这种情况,答案总是你需要使用clone
. 对我来说,这似乎表明默认情况下会存储参考。
所以当我遇到以下行为时我真的很困惑......
$inner = ['key1'=>"value1"];
$outer = [];
$outer['inner'] = $inner;
$inner['key2'] = "value2";
print_r($inner);
echo "<br>";
print_r($outer['inner']);
输出:
数组 ( [key1] => value1 [key2] => value2 )
数组 ( [key1] => value1 )
两年来,我一直在做相当认真的 PHP 编码,这似乎与我认为我所知道的关于数组的一切背道而驰,所以这真的让我大吃一惊。
Stack Exchange 上的类似问题往往会得到“您应该参考文档”的答案。但是我在文档中找不到任何东西可以清楚地解决这个问题。
解决方案
您只是将当时的值分配$inner
给$outer['inner']
. 之后,$outer['inner']
是它自己的数组,它不维护对$inner
. 这是数组的预期行为。
来自数组的 PHP 文档:
数组赋值总是涉及值复制。使用引用运算符通过引用复制数组。
所以如果要维护一个引用,就需要使用引用操作符:
// Set the original values
$inner = ['key1' => 'value1'];
// Assign by reference
$outer = [];
$outer['inner'] = &$inner;
// Modify the original array afterwards
$inner['key2'] = 'value2';
然后,您会发现$outer['inner']
保留对 的引用$inner
,即使它在分配后已更改。
print_r($inner);
print_r($outer['inner']);
它们将是相同的:
Array ( [key1] => value1 [key2] => value2 )
Array ( [key1] => value1 [key2] => value2 )
注意:使用引用通常不是一个好主意,我不记得曾经真正需要它们。Stack Overflow 上已经对此进行了很好的讨论。
推荐阅读
- typescript - 如何在 TypeScript 中键入 node-postgres 异步查询函数?
- animation - Flutter:如何修复页面控制器动画错误
- python - 代码对象的 Python 类型提示/注释
- performance - 有没有办法为两个不同的输入文件启动两次相同的 Spring Batch 作业?
- android - 在 Android SQlite 数据库中我收到此错误:E/SQLiteLog: (1) 表 tbl_Individual_Registration 没有名为 MobileNo 的列
- c++ - 为什么二进制搜索不适用于我的测试?
- nestjs - 测试一个重新触发的控制器 API
- java - ActiveProfile 在 Junit5 测试中不起作用
- python - ModelForm 没有指定模型类。姜戈
- rabbitmq - 如何在 RabbitMQ 中将 UnAck 消息移动到就绪状态