• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:null代入とunset()の違いについて)

null代入とunset()の違いについて

このQ&Aのポイント
  • null代入とunset()の違いについて調査しました。null代入は変数にnullを代入することで、unset()は変数を破棄することです。
  • null代入とunset()の違いについて調査しました。null代入は変数にnullを代入することで、unset()は変数の存在自体をなくすことです。
  • null代入とunset()の違いについて調査しました。null代入は変数にnullを代入することで、unset()は変数を削除することです。

質問者が選んだベストアンサー

  • ベストアンサー
  • neko-ten
  • ベストアンサー率55% (1287/2335)
回答No.2

NULL代入は、変数にnullという値(というのもおかしいですが・・・)を代入した変数を作る、もしくはnullを代入する・・・ unsetは、シンボルテーブルから対象変数を取り除く・・・ ってかんじのようです。 var_dumpで出力するとどっちもnull出しますが・・・。 たとえば、配列の一部をunsetした場合、null代入した場合ではforeachでの動作が変わります。 null代入の場合は、シンボルテーブルには存在するためにforeachで評価されます。 unsetの場合、シンボルテーブルに存在しないため、評価されません。 ・・・というのが、漠然とした理解です・・・。 多分もっといろんなことあると思うんですが・・・っ・・・。くわしくなくてすいません。orz

re999
質問者

お礼

回答ありがとうございました。 配列の一部に対して処理をしてみる、ということに、全く考えが及びませんでした。 早速試してみたところ、明確に違いが確認できました。 大変参考になりましたー

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

メモリの使用状況もみてみては? <?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-usage.php
re999
質問者

お礼

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

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.3

挙げられたページに良く解説されていますね。 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だと警告じゃなくてエラーとなりプログラムの実行が中断します。

re999
質問者

お礼

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

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.1

スカラー変数だと大差がないのかもしれませんね。 こうすると分かりやすいかと思います。 後者では変数の存在自体が消えています。 <?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 ?>

re999
質問者

お礼

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

関連するQ&A