php变量销毁依赖引用计数与垃圾回收机制:refcount为0时立即释放内存,循环引用需gc处理;unset()仅减引用计数,不保证即时释放;局部变量函数结束自动脱离作用域,static变量除外;全局及超全局变量生命周期长,手动清理推荐unset()或赋null。

PHP 变量销毁的核心是引用计数 + 垃圾回收
PHP 不是“用完立即销毁”,而是通过 引用计数(refcount) 判断变量是否还被使用。当 refcount 降为 0,内存立刻释放;若存在循环引用(如对象互相持有),则靠 GC(Garbage Collection)机制 在特定时机(如根缓冲区满时)统一清理。
unset() 并不总是立即释放内存
unset() 的作用是断开当前符号表对变量的引用,即让 refcount 减 1。它不直接触发销毁,也不保证内存马上归还系统。例如:
- 变量 $a = [1,2,3]; $b = $a; unset($a); → $b 仍存在,数组内存未释放
- 对象属性中存有对自身的引用(如 $obj->parent = $obj),即使 unset($obj),refcount 也不归零,需 GC 处理
局部变量在函数结束时自动脱离作用域
函数执行完毕后,其栈帧销毁,所有局部变量的引用被批量移除。此时若 refcount 归零,对应值立即释放;否则等待 GC。注意:static 局部变量例外——它不随函数退出而销毁,生命周期贯穿整个请求。
全局变量和超全局变量更难被销毁
全局变量(包括 $GLOBALS 中的条目)在整个脚本生命周期内有效,除非显式 unset 或脚本结束。$_SESSION、$_POST 等超全局变量还受 PHP 运行模式影响(如 CLI 下无 session 自动管理)。手动销毁建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
unset($_SESSION['key'])清单项,而非$_SESSION = [](后者可能残留引用) - 大数组或对象不再需要时,优先设为
null或unset(),避免隐式复制导致 refcount 滞留











