在php程序中经常会用到一个双重循环来构造一个二维或多维数组的数据。
在内层循环中一定要记得每次变量使用之后进行unset,否则下次循环会在此基础上继续增加数据。这是常识但是程序中经常出现这样的bug;
在运行时间较长的脚本中,一定要对反复使用的数组进行unset 以防内存泄漏
鉴于程序中出现了此类bug,查了下php 手册,深入的了解下unset。
unset — 释放给定的变量
unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。
A、如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,其它地方此变量将保持调用 unset() 之前一样的值。
输出:
blah
something
B、unset一个引用变量,只是释放了函数内部的局部变量,原变量不变。
输入:something
something
C、在函数中unset一个静态变量,在下次调用该函数时被重新定义(也就是说unset 静态变量只在此函数内部unset之后的部分起作用)。
输出:
Before unset: 1, after unset: 22
Before unset: 2, after unset: 22
Before unset: 3, after unset: 22
鉴于程序中出现了此类bug,查了下php 手册,深入的了解下unset。
unset — 释放给定的变量
unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。
A、如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,其它地方此变量将保持调用 unset() 之前一样的值。
<?php
function foo() {
global $bar;
unset($bar);
$bar = "blah\n";
echo $bar;
}
$bar="something";
foo();
echo "$bar\n";
?>
输出:
blah
something
如果真的想销毁 全局变量,用以下代码:
<?php
function foo() {
global $bar;
unset($GLOBALS['bar']);
$bar = "blah\n";
echo $bar;
}
$bar="something";
foo();
echo "$bar\n";
?>
B、unset一个引用变量,只是释放了函数内部的局部变量,原变量不变。
<?php
function foo(&$bar) {
unset($bar);
$bar = "blah";
}
$bar = 'something';
echo "$bar\n";
foo($bar);
echo "$bar\n";
?>
输入:something
something
C、在函数中unset一个静态变量,在下次调用该函数时被重新定义(也就是说unset 静态变量只在此函数内部unset之后的部分起作用)。
<?php
function foo()
{
static $bar;//没有已定义的bar 新定义
$bar++;
echo "Before unset: $bar, ";
unset($bar);//静态变量被unset
$bar = 23;
echo "after unset: $bar\n";
}
foo();
foo();
foo();
?>
输出:
Before unset: 1, after unset: 22
Before unset: 2, after unset: 22
Before unset: 3, after unset: 22