这篇文章给大家介绍怎么在PHP中实现一个垃圾回收机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
<>强顽固垃圾的产生过程强>
& lt; PHP ? 时间=美元才能a “new string"; ?在
代码中,<代码> $> 代码变量内部存储信息为
答:,(refcount_gc=1, is_ref_gc=0)=& # 39; new 字符串# 39;
当把,,,,,,,一个,,,,,赋,,,,,值,,,,,给,,,,,另,,,,,外,,,,,一,,,,,个,,,,,变,,,,,量,,,,,的,,,,,时,,,,,候,,,,,,,,,,,一个赋值给另外一个变量的时候,,,,,一个赋值给另外一个变量的时候,一个对应的zval的<代码> refcount_gc> 代码会加1
& lt; php ? 时间=美元才能a “new string"; 时间=美元才能b 一美元; 祝辞;
此时,,,,,,,一个,,,,,和,,,,,,一个和,,,a和b,变量对应的内部存储信息为,,,,,,,,一个,,,,,和,,,,,,一个和,,,a和b,同时指向一个字符串“新string",它的refcount变成2
a, b:, (refcount_gc=2,, is_ref=0)=& # 39; new 字符串# 39;
当用设置删除b美元变量时,“新字符串”的refcount_gc会减1变成1 .
& lt; php ? a 美元;=,才能“new string",,//:, (refcount_gc=1, is_ref_gc=0)=& # 39; new 字符串# 39; b 美元;才能=,美元一个,,,,,,,//a, b:, (refcount_gc=2,, is_ref=0)=& # 39; new 字符串# 39; 设置才能($ b);,,,,,//:, (refcount_gc=1, is_ref=0)=& # 39; new 字符串# 39; 祝辞;
对于普通的变量来说,这一切很正常,但是在复合类型变量(数组和对象)中,会发生比较有意思的事情:
& lt; php ? 时间=美元才能a 数组(& # 39;意义# 39;,=祝辞,& # 39;生活# 39;,,& # 39;数字# 39;,=祝辞,42); ?在
<代码> $ 代码>内部存储信息为:
答:,(refcount=1, is_ref=0)=array ( & # 39;意义# 39;,=祝辞,(refcount=1, is_ref=0)=& # 39;生活# 39; & # 39;数字# 39;,=祝辞,(refcount=1, is_ref=0)=42 )
数组变量本身(美元)在引擎内部实际上是一个哈希表,这张表中有两个zval项意义和号码,所以实际上那一行代码中一共生成了3个zval,这3个zval都遵循变量的引用和计数原则,用图来表示:
下面在<代码> $ 代码>中添加一个元素,并将现有的一个元素的值赋给新的元素:
& lt; PHP ? 时间=美元才能a 数组(& # 39;意义# 39;,=祝辞,& # 39;生活# 39;,,& # 39;数字# 39;,=祝辞,42); 美元才能(& # 39;名字# 39;],=,一美元(& # 39;意义# 39;); ?在
那么<代码> $> 代码的内部存储为,“生命”的ref_count变成2,42的ref_count是1:
答:,(refcount=1, is_ref=0)=array ( & # 39;意义# 39;,=祝辞,(refcount=2,, is_ref=0)=& # 39;生活# 39; & # 39;数字# 39;,=祝辞,(refcount=1, is_ref=0)=42岁 & # 39;名字# 39;,=祝辞,(refcount=2,, is_ref=0)=& # 39;生活# 39; )
如果将数组的引用赋值给数组中的一个元素,有意思的事情就会发生:
& lt; php ? 时间=美元才能a 数组(& # 39;一个# 39;); 一个美元才能[],=,,一美元; 祝辞;
这样,,,,,,,一个,,,,,数,,,,,组,,,,,就,,,,,有,,,,,两,,,,,个,,,,,元,,,,,素,,,,,,,,,,一,,,,,个,,,,,索,,,,,引,,,,,为,,,,,0,,,,,,,,,,值,,,,,为,,,,,字,,,,,符,,,,,啊,,,,,n,,,,,e,,,,,,,,,,另,,,,,外,,,,,一,,,,,个,,,,,索,,,,,引,,,,,为,,,,,1,,,,,,,,,,为,,,,,,null null null null null null null null