写php代码时,为了节约内存,会经常使用unset或者把变量设置为null。 但是他们有什么区别呢?让我看看看看下面的代码。看过之后,你会明白一些东西。
<?php
echo "小于等于256时,unset:\n";
$s= str_repeat ( '1', 256 ); //产生由255个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
unset ( $s );
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "小于等于256时,null:\n";
$s= str_repeat ( '1', 256 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$s= null;
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,unset:\n";
$s= str_repeat ( '1', 257 ); //产生由255个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
unset ( $s );
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,null:\n";
$s= str_repeat ( '1', 257 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$s= null;
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,引用后,unset:\n";
$s= str_repeat ( '1', 300 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$p=& $s;
unset ( $s );
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,引用后,unset两次:\n";
$s= str_repeat ( '1', 300 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$p=& $s;
unset ( $s );
unset ( $p );
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,引用后,null:\n";
$s= str_repeat ( '1', 300 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$p=& $s;
$s= null;
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "小于等于256时,unset:\n";
$s= str_repeat ( '1', 256 ); //产生由255个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
unset ( $s );
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "小于等于256时,null:\n";
$s= str_repeat ( '1', 256 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$s= null;
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,unset:\n";
$s= str_repeat ( '1', 257 ); //产生由255个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
unset ( $s );
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,null:\n";
$s= str_repeat ( '1', 257 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$s= null;
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,引用后,unset:\n";
$s= str_repeat ( '1', 300 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$p=& $s;
unset ( $s );
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,引用后,unset两次:\n";
$s= str_repeat ( '1', 300 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$p=& $s;
unset ( $s );
unset ( $p );
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
echo "大于256时,引用后,null:\n";
$s= str_repeat ( '1', 300 ); //产生由256个1组成的字符串
$m= memory_get_usage ( ); //获取当前占用内存
$p=& $s;
$s= null;
$mm= memory_get_usage ( ); //unset()后再查看当前占用内存
echo "{$m}\n";
echo "{$mm}\n";
echo $m- $mm;
echo "\n";
打印的结果如下:
小于等于
256时,
unset:
113504
113224
280
小于等于 256时,null:
113776
113496
280
大于 256时, unset:
113776
113360
416
大于 256时,null:
113776
113496
280
大于 256时,引用后, unset:
113816
113816
0
大于 256时,引用后, unset两次:
114272
113360
912
大于 256时,引用后,null:
113816
113592
224
113504
113224
280
小于等于 256时,null:
113776
113496
280
大于 256时, unset:
113776
113360
416
大于 256时,null:
113776
113496
280
大于 256时,引用后, unset:
113816
113816
0
大于 256时,引用后, unset两次:
114272
113360
912
大于 256时,引用后,null:
113816
113592
224
得到的结论:
- null和unset都可以释放内存。
- 变量大小不超过256时,使用null和unset释放的内存大小相同。
- 变量大小超过256时,使用unset释放的内存比null要多。
- 变量被引用时,使用unset无法释放内存,直到所有引用都被释放。
- 变量被引用时,使用null可以强制释放内存。
以上结论需要通过查看源代码来认证。