我将我们的网站从旧主机迁移到具有最新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的设置。
有人有想法吗?
答案 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
,反之亦然。