Php Laravel原始变量影响临时变量
我试图将原始数据保存在名为Php Laravel原始变量影响临时变量,php,laravel,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&q
$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
为什么要更改我的临时变量
使用
克隆$items
方法,结果是相同的。否,它应该打印stackoverflow。如果你从另一个角度来看
$items = \App\Models\Customers::with('Account')->get();
$copyItems = $items;
以上是指:
$items = \App\Models\Customers::with('Account')->get();
$copyItems = \App\Models\Customers::with('Account')->get();
然后它运行:
echo $copyItems[0]->Account->name;
$items[0]->Account->name = 'John';
所以它会打印出stackoverflow。然后它运行:
echo $copyItems[0]->Account->name;
$items[0]->Account->name = 'John';
上述命令基本上是指:
$copyItems[0]->Account->name = 'John';
这就是下一个命令输出John的原因:
echo $copyItems[0]->Account->name;
将对象指定给另一个变量时,您没有复制该对象
$copyItems
和$items
指向同一个精确的对象
克隆在这里没有帮助,因为clone
将复制集合实例。这两个集合都有实际指向相同确切对象的项,因为克隆并不是克隆集合中的每个对象,它只是克隆集合对象本身
基本上,变量不包含对象,它包含一个标识符。这就是为什么你听到/看到人们说对象总是通过引用传递的,这足以让人理解,但并不完全正确。PHP手册对此做了一些解释
“从PHP5开始,对象变量不再包含对象本身作为值。它只包含一个允许对象访问器查找实际对象的对象标识符。当一个对象通过参数发送、返回或分配给另一个变量时,不同的变量不是别名:它们持有指向同一对象的标识符副本。”
您可以将Laravel集合用于
$copyItems
$copyItems=collect($items);
这可能会对您有所帮助out@SandroVardiashvili->replicate()
在数据库中创建新行,我不需要它。您不是在“复制”“将对象分配给另一个变量时。。。两个变量都指向同一个对象。。。调用clone
只会克隆集合,而不会克隆其中的每个对象,因此即使是新集合也会包含与其他集合完全相同的对象。在这种情况下,您可以对$copyItems
使用Laravel集合,只需执行$copyItems=collect($items)
@SandroVardiashvilicollect($items)
在我的情况下工作得很好,这样我就不需要再进行数据库查询了。将它设置为一个答案,我会接受它。不,它不应该为第二个回声打印“stackoverflow”,他们看到的输出是正确的。。。指定时不会复制对象。。。在他们的示例中,这两个变量都指向同一个确切的对象