【问题标题】:Values inside PHP session changes after storing object into it将对象存储到其中后,PHP 会话中的值会发生变化
【发布时间】:2013-12-06 14:44:51
【问题描述】:

当我在 PHP 5.3 中将对象存储到会话中,然后尝试更改其属性时,它们在会话数组中也发生了变化。为什么会这样?请解释一下!

我的代码:

<?php 
class Z {
    public $val;
}
session_start();
$z = new Z();
$z->val = 10;
$_SESSION['z'] = $z;
$z->val++;
print_r($_SESSION);
?>

结果:

Array ([z] => Z Object ( [val] => 11 ) ) 

【问题讨论】:

标签: php session object store


【解决方案1】:

PHP 不是创建对象的副本,而是在会话中存储一个引用。

如果你想要一份副本,请使用clone()

$_SESSION['z'] = clone $z;

【讨论】:

  • 那么,当我的 php 脚本完成时,对象是否会删除表单内存但仍处于会话状态?我的会话存储到文件。
  • @user3019468 一旦你把东西放到会话中,它就会一直留在那里,直到会话被销毁或者你自己删除它。使用unset($_SESSION['z']) 自行删除。
  • 是的,谢谢。但我想知道,当我的脚本完成时,是否有任何对象 $z 留在 RAM 中?如果没有,那么$_SESSION['z'] 有一个指向不存在对象$z 的链接?
  • 正如您所指出的,您的会话存储在一个文件(一个 tmp 文件)中。所以不,它不会留在 RAM 中。 PHP 在脚本结束时自动序列化会话中的任何对象,并在下一个请求开始时自动反序列化它们。
  • 您说$_SESSION['z'] - 是对$z 的引用。所以当脚本完成时,真正的$z 会从 RAM 中销毁,对吗?但它是$_SESSION['z'] 中的“复制”序列化并存储到 tmp 文件。当我开始一个新的脚本$_SESSION['z'] 将是内存中的一个新对象。我说的对吗?
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 2012-01-26
  • 2011-07-31
  • 1970-01-01
  • 2015-06-18
相关资源
最近更新 更多