我将我们的网站从旧主机迁移到使用最新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
,反之亦然