{$count=0;foreach($personsas$person){if($person['nation']=='china'){$person['score']=10;$count++;}}//利用score做一些处理...return$count;}在上面的代码中,我修改了数组的成员内容,如果你不在参数里加&;的话,内存消耗会逐步增加,在返回以前,内存的占用会double,为撒呢?因为为了满足你的write需要,php进行了copy,这个copy不是一次完成的,在改变第一个$persons成员的时候,会将$persons数组和其成员的地址复制过来,并不会把所有成员内容都复制过来,随着$persons成员的一个个被write,一个个也都被copy过来,内存占用线性增加,到循环结束时,double了!如果确实要修改内容,又想避免内存消耗,又不怕影响参数变量在其他地方的使用,那就在参数里加&;吧。要释放被占用的内存变量,用unset($persons)或者$persons=null都可以迅速地释放掉,你可以使用memory_get_usage进行监控,貌似这个机制比.net体系的垃圾回收机制要清晰,简单和高效,asp.net经常出现的outofmemory无疑是.net庞大体系和低效内存回收机制的必然结果。(5)unset的作用unset()并非一个函数,而是一种语言结构,这个可以通过查看编译生成的opcode看到区别,unset对应的不是一个函数调用的opcode。那么unset到底做了什么?在unset对应的opcode的handler中可以看到相关内容,主要的操作时从当前符号表中删除参数中的符号,比如在全局代码中执行unset($a),那么将会在全局符号表中删除a这个符号。全局符号表是一张哈希表,建立这张表的时候会提供一个表中的项的析构函数,当我们从符号表中删除a的时候,会对符号a指向的项(这里是zval的指针)调用这个析构函数,这个析构函数的主要功能是将a对应的zval的refcount减1,如果refcount变成了0,那么释放这个zval。所以当我们调用unset的时候,不一定能释放变量所占的内存空间,只有当这个变量对应的zval没有别的变量指向它的时候,才会释放掉zval,否则只是对refcount进行减1操作。
2.垃圾回收机制
中的垃圾回收算法——ReferenceCounting(1)PHP5.2中的垃圾回收算法)PHP5.2中使用的内存回收算法是大名鼎鼎的ReferenceCounting,这个