プロが教えるわが家の防犯対策術!

null代入とunset()では、違いがあるのでしょうか?

検索してみたところ、下記ページにたどり着いたのですが、
結論としては、このページ下のコメントに書かれているとおり、
あまり気にしなくてよいでしょうか?
http://www.cpa-lab.com/tech/097
>利用者からは気にする必要が無い部分ではないかと

<経緯>
nullが分からないので、調べていました。
var_dump($x);//未定義では、NULL

$x = NULL;
var_dump($x);//NULLを代入しても、NULL

$y = "hoge";
unset($y);
var_dump($y);//unsetしても、NULL

ここまできて、
「NULLを代入する」と、「変数破棄」の違いが、
分からなくなりました…

A 回答 (4件)

NULL代入は、変数にnullという値(というのもおかしいですが・・・)を代入した変数を作る、もしくはnullを代入する・・・


unsetは、シンボルテーブルから対象変数を取り除く・・・

ってかんじのようです。
var_dumpで出力するとどっちもnull出しますが・・・。

たとえば、配列の一部をunsetした場合、null代入した場合ではforeachでの動作が変わります。
null代入の場合は、シンボルテーブルには存在するためにforeachで評価されます。
unsetの場合、シンボルテーブルに存在しないため、評価されません。

・・・というのが、漠然とした理解です・・・。
多分もっといろんなことあると思うんですが・・・っ・・・。くわしくなくてすいません。orz
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

配列の一部に対して処理をしてみる、ということに、全く考えが及びませんでした。
早速試してみたところ、明確に違いが確認できました。

大変参考になりましたー

お礼日時:2011/06/07 01:58

メモリの使用状況もみてみては?



<?PHP
print memory_get_usage()."<br>\n";
$a=1;
print memory_get_usage()."<br>\n";
$a=null;
print memory_get_usage()."<br>\n";
unset($a);
print memory_get_usage()."<br>\n";
?>

参考URL:http://www.php.net/manual/ja/function.memory-get …
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
そのまま試しただけだと違いは分からなかったのですが、
この情報で検索してみたところ、
検査用関数を作ったり、色々試しているサイトへたどり着くことができました。

ありがとうございましたー

お礼日時:2011/06/07 02:02

挙げられたページに良く解説されていますね。



var_dump($a);
と、
$a="hoge";unset($a);var_dump($a);
は、同じで、PHP Notice: Undefined variable: という警告が出ます。(php.ini等で抑止していない場合)

$a=NULL;var_dump($a);
は、警告が出ません。

PHPしか知らないとわかりにくいかもしれませんが、多くの他の言語では変数の宣言/定義が必要です。例えばCだと、
int a;
のように整数型の変数を宣言します。宣言無しで変数を使うとエラーになります。

PHPのようなスクリプト言語の場合は、変数に何か代入することで宣言/定義に代えるという言語が多いです。いきなり var_dump($a); と書くとこれは代入じゃなくて参照なので、$aはまだ定義されておらず、未定義(Undefined)の変数(variable)を参照したことになり、上記のメッセージが出ます。ただし、エラーでなく警告に留まり、値としてはNULLが入ってたとみなして実行は続行します。
$a=NULL; を書くと値はNULLであっても代入されているので定義されていると見なされ警告は出ません。
unset($a) は、変数$aの定義を無かったことにします。なので、その時点で定義されていても以降で参照すると上記の警告メッセージが出ます。

警告を出す理由としては、「値を何も代入していない変数を参照することはあり得ないだろう。タイプミスじゃないのか?」ということです。
$hensuu="hoge"; var_dump($hensu);
みたいな。
スクリプト言語でも、RubyやJavaScriptだと警告じゃなくてエラーとなりプログラムの実行が中断します。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
説明大変分かりやすかったです。

>スクリプト言語でも、RubyやJavaScriptだと警告じゃなくてエラーとなりプログラムの実行が中断します
こういった情報も、大変参考になりましたー

お礼日時:2011/06/07 02:00

スカラー変数だと大差がないのかもしれませんね。


こうすると分かりやすいかと思います。
後者では変数の存在自体が消えています。

<?php
$a = array();
$a["k"] = "v";
printf(">> %s\n", $a["k"]); // "v"
$a["k"] = null;
printf(">> %s\n", $a["k"]); // ""

$a = array();
$a["k"] = "v";
printf(">> %s\n", $a["k"]); // "v"
unset($a["k"]);
printf(">> %s\n", $a["k"]); // Notice: Undefined index: k
?>
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
エラーレベル変更したら、
連想配列で、Notice:確認できましたー

お礼日時:2011/06/07 01:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!