PHP使い始めて4年以上。今日、初めてこの罠をしった・・・。
http://jp.php.net/manual/ja/function.unset.php
にありますが、関数内で、その関数の外で定義した変数をunset()しても、unset()されてるのは関数の中だけで、関数の外では以前と同じ値が保持されるんですわ。
例えば外で定義されてる$_BOHEという変数をunset()する関数で、以下のどれが正解かというと・・・
function __UNSET1() {
global $_BOHE;
unset($_BOHE);
}
function __UNSET2(&$val) { // ex) __UNSET2($_BOHE);
unset($val);
}
function __UNSET3($var_name) { // ex) __UNSET3('_BOHE');
global $$var_name;
unset($$var_name);
}
function __UNSET4($var_name) { // ex) __UNSET4('_BOHE');
unset($GLOBALS[$var_name]);
}
$GLOBALSでとってる__UNSET4()だけが正解。 これは実際に実験して確認しました。
ただ、変数を直接unset()するのは確かに$GLOBALSでなきゃだめなんですが、私自身は今までちょくちょく
function hogehoge() {
...
global $_HOGE
unset($_HOGE['key']);
}
とか大量に書いてきて、それでちゃんと動いてました。
つまり、変数を直接unsetするのはN.G.なんですが、変数が配列の時、そのキー値をunsetするのは平気みたいです。
とりあえず以上です。unset()には気をつけましょう。