php - Laravel 原始变量影响临时变量
问题描述
我试图将原始数据保存在一个名为 的临时变量中$copyItems
,但是每当我更改原始变量的值时,$items
它也会在复制的变量中发生变化。
举个例子:
$items = \App\Models\Customers::with('Account')->get();
$copyItems = $items; // Should hold all the original $items values no matter the changes
// Prints "Stackoverflow"
echo $copyItems[0]->Account->name;
$items[0]->Account->name = 'John';
// Prints "John" and should print "Stackoverflow"
echo $copyItems[0]->Account->name;
这到底是怎么回事?我没有使用变量引用&$items
,为什么要更改我的临时变量?
使用该clone $items
方法,结果是相同的。
解决方案
当您将对象分配给另一个变量时,您不会复制它。$copyItems
并且$items
指向同一个确切的对象。
克隆在这里无济于事,clone
复制 Collection 实例也是如此。这两个集合的项目实际上都指向相同的对象,因为 clone 不会克隆集合中的每个对象,它只是克隆 Collection 对象本身。
基本上,变量不保存对象,它包含一个标识符。这就是为什么你听到/看到人们说对象总是通过引用传递的,这足以理解但并不完全正确。PHP 手册对此做了一些解释。
“从 PHP 5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者找到实际对象。当一个对象通过参数发送时,返回或分配给另一个变量,不同的变量不是别名:它们持有标识符的副本,它指向同一个对象。”
推荐阅读
- python - pyspark中的导入模块
- scala - 带有索引的爆炸列
- r - R 的 Logit 模型如何处理 stats 包中的分类变量?
- vba - VBA - 取消对话框运行时错误 1004
- angular - 仅在应用程序第一次运行时显示教程 | 离子3
- python - 将数字数组格式化为值之间宽度最小的货币
- hibernate - 如何使用 Thymeleaf、JPA 和 Spring 填充另一个选择框
- ibm-mq - 在不依赖异常的情况下在 IBM MQ 上接收消息(基于示例代码)
- database - laravel队列工作者的持久连接?
- jmeter - Jmeter记录错误401