PHP版本不同,错误的变量被覆盖
我用最新的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
$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,这就可以解释这个问题。