Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel原始变量影响临时变量_Php_Laravel - Fatal编程技术网

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)
@SandroVardiashvili
collect($items)
在我的情况下工作得很好,这样我就不需要再进行数据库查询了。将它设置为一个答案,我会接受它。不,它不应该为第二个回声打印“stackoverflow”,他们看到的输出是正确的。。。指定时不会复制对象。。。在他们的示例中,这两个变量都指向同一个确切的对象