home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

PHP/Tips/20051016/外部定義された変数を関数内でunset()するときの罠

作成日: 2005-10-16 23:35:43   /   last updated at: 2008-12-22 23:37:21
カテゴリ: PHP 

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


original url: https://www.glamenv-septzen.net/view/60