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

PHP版本不同,错误的变量被覆盖,php,Php,我用最新的PHP版本将我们的网站从旧主机迁移到新主机。 发生了一些问题,我设法解决了 现在有一件事让我抓狂。 请看下面的片段,也许有人能解释一下为什么会发生这种情况 $cms_items = $items; $cms_items->settings = $settings_cms; $cms_items->settings->table->head = 1; //head in overview mode. //var_dump($cms_i

我用最新的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\u项目的设置
,还会覆盖$items的设置。 我不知道为什么

当我删除
$cms\u项目->设置=$settings\u cms
和dump$items没有任何内容被覆盖,一切正常

因此,不知何故,这一行
$cms\u items->settings=$settings\u cms
不仅更改
$cms\u项目的设置
,还更改$items的设置

有人有主意吗

做什么

$cms_items = $items;
$cms_items->settings = $settings_cms; 
是否不创建
$settings\u cms
的单独副本

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

因此,如果您在
$settings\u cms
中更改了某些内容,那么
$cms\u items
中的内容也会更改,反之亦然,因为它们都包含指向同一对象的指针

另请参见PHP文档中的

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

$cms_items->settings = clone $settings_cms; 

现在您可以更改
$cms\u items->settings
,而无需更改
$settings\u cms
,反之亦然。

这是因为所有对象变量都引用到该对象。如果要创建
$items
的副本,请使用
$cms\u items=clone$items@mlask听起来像一个答案:)它取决于变量的值类型。。。如果它是一个对象,则它用作引用,否则它由值使用。这在PHP4和PHP5之间发生了变化。然而,PHP5是在大约10年前发布的,PHP4不受支持,并且很长时间没有收到安全更新。谢谢,所以这在不同的PHP版本之间发生了变化?因为在旧主机上,它工作得很好,设置没有被覆盖。如果你能分辨出两台主机使用的是哪一个版本的PHP,这会有所帮助,但据我所知,这是PHP5的一个特性。所以,如果您的旧主机仍在使用PHP4,这就可以解释这个问题。