PHP版本差异,错误变量被覆盖

时间:2014-06-05 11:10:40

标签: php

我将我们的网站从旧主机迁移到具有最新PHP版本的新主机。 发生了一些问题,我设法解决了这些问题。

现在有一件事让我发疯。 请看下面的片段,也许有人可以解释一下为什么会发生这种情况。

    $cms_items = $items;
     $cms_items->settings = $settings_cms; 
     $cms_items->settings->table->head = 1; //head in overview mode.
//var_dump($cms_items);
//var_dump($items);

这些设置不仅会覆盖$cms_items,还会覆盖$ item。 我不知道为什么。

当我删除$cms_items->settings = $settings_cms;并转储$ items时,没有任何内容被覆盖,一切都很好。

所以这一行[{1}}不仅会更改$cms_items->settings = $settings_cms;的设置,还会更改$ items的设置。

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

否则

$cms_items = $items;
$cms_items->settings = $settings_cms; 

会创建$settings_cms的单独副本。

要理解这一点,您必须知道对象变量不包含对象本身,而只包含引用内存中实际对象的对象标识符。因此,如果将包含对象的变量复制到新变量中,它们将包含相同的对象标识符,并引用同一对象。

因此,如果您更改了$settings_cms中的内容,它也会在$cms_items中更改,反之亦然 - 只是因为它们都包含指向同一对象的指针。

另请参阅PHP文档中的Objects and references

如果那不是您想要的,而您想要一个单独的对象,则需要clone该对象:

$cms_items->settings = clone $settings_cms; 

现在,您可以更改$cms_items->settings而无需更改$settings_cms,反之亦然。