首页 > 解决方案 > 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方法,结果是相同的。

标签: phplaravel

解决方案


当您将对象分配给另一个变量时,您不会复制它。$copyItems并且$items指向同一个确切的对象。

克隆在这里无济于事,clone复制 Collection 实例也是如此。这两个集合的项目实际上都指向相同的对象,因为 clone 不会克隆集合中的每个对象,它只是克隆 Collection 对象本身。

基本上,变量不保存对象,它包含一个标识符。这就是为什么你听到/看到人们说对象总是通过引用传递的,这足以理解但并不完全正确。PHP 手册对此做了一些解释。

“从 PHP 5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者找到实际对象。当一个对象通过参数发送时,返回或分配给另一个变量,不同的变量不是别名:它们持有标识符的副本,它指向同一个对象。”

PHP.net 手册 - OOP - 对象和引用


推荐阅读