PHP 4.3.9中$_SESSION赋值后内容丢失问题求助
没错,这确实是PHP 4.x版本(包括你使用的4.3.9)里一个容易踩坑的特性!
为什么会出现这个问题?
在PHP 4的SESSION实现机制中,当你访问$_SESSION['ins_inscription']这类数组类型的SESSION变量时,返回的实际上是对SESSION内部存储数据的引用,而不是一个独立的数组副本。当你执行:
$tempInsInscription = $_SESSION['ins_inscription'];
这步操作并没有创建新的数组,而是让$tempInsInscription和$_SESSION['ins_inscription']指向了同一块内存区域。
接下来你对$tempInsInscription执行的reset()和嵌套的foreach遍历操作,会直接修改原SESSION数组的内部指针和结构。尤其是嵌套的reset()操作,可能会干扰数组的遍历状态,最终导致原$_SESSION['ins_inscription']的内容被意外清空。
如何解决这个问题?
要避免操作临时变量影响原SESSION数组,你需要手动创建一个完全独立的数组副本。在PHP 4中,最简单的方式是通过serialize()和unserialize()来实现深拷贝:
// 先序列化再反序列化,生成独立的数组副本 $tempInsInscription = unserialize(serialize($_SESSION['ins_inscription']));
这样$tempInsInscription就是一个和原SESSION数组完全无关的副本,后续的reset()、foreach遍历操作都不会影响$_SESSION['ins_inscription']的内容。
另外,如果你知道数组的结构比较简单,也可以通过循环手动复制每个元素,但serialize/unserialize的方式更通用,适合任意复杂度的数组。
补充说明
这个问题在PHP 5及以后的版本中已经被彻底修复。PHP 5+中数组默认是值传递(除非显式使用&声明引用),直接赋值$temp = $_SESSION['key']会自动创建数组副本,不会出现这种原变量被修改的情况。
内容的提问来源于stack exchange,提问作者LynxWeb

