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()には気をつけましょう。