PHP版本不同,错误的变量被覆盖


PHP difference in versions, wrong variable gets overwritten

我将我们的网站从旧主机迁移到使用最新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,还会覆盖$items。我不知道为什么。

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

所以$cms_items->settings = $settings_cms;这一行不仅改变了$cms_items的设置,也改变了$items的设置。

有人知道吗?

Doing

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

是否创建$settings_cms的单独副本?

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

所以如果你在$settings_cms中改变了一些东西,它也会在$cms_items中改变,反之亦然——仅仅因为它们都包含指向同一个对象的指针。

请参见PHP文档中的对象和引用。

如果这不是你想要的,而是你想要一个单独的对象,你需要克隆对象:

$cms_items->settings = clone $settings_cms; 

现在你可以改变$cms_items->settings而不改变$settings_cms,反之亦然