PHP 變數在底層以 zval 結構儲存,包含:
透過 xdebug_debug_zval() 可觀察變數內部狀態。
<?php $a = 'aa'; // refcount=1, is_ref=0 $b = $a; // refcount=2(共用同一容器) unset($b); // refcount=1,容器未釋放 $b = $a; // refcount=2 $b = 'bb'; // 觸發 Copy-on-Write:$b 獲得新容器,$a 保持原值 ?>
<?php $a = 'aa'; $b = &$a; // refcount=2, is_ref=1(標記為引用集合) $b = '123'; // 直接修改共用容器,$a 也變成 '123' unset($b); // refcount=1, is_ref=0(引用關係解除) ?>
<?php $a = 'aa'; $b = &$a; $c = &$a; // refcount=3, is_ref=1 unset($b); // refcount=2, is_ref=1(不歸零,容器保留) $e = $a; // 賦值給非引用變數:觸發 Copy-on-Write,新容器 refcount=1 ?>
| 操作 | refcount 變化 | 容器釋放 | 適用場景 |
|---|---|---|---|
unset($var) | -1 | 歸零時立即釋放 | 徹底移除變數綁定 |
$var = null | 不變(舊容器改存 null) | 不釋放(容器仍存在) | 清空值但保留變數名 |
<?php $a = 'aa'; $b = $a; $b = null; // $b 新容器存 null,$a 不受影響 unset($b); // $b 容器釋放,$a refcount 回到 1 ?>
gc_collect_cycles())gc_collect_cycles() 或升級 PHP 7.3+ 享有改良 GCunset() 釋放記憶體memory_get_usage() 監控記憶體峰值