
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を代入する」と、「変数破棄」の違いが、
分からなくなりました…
No.2ベストアンサー
- 回答日時:
NULL代入は、変数にnullという値(というのもおかしいですが・・・)を代入した変数を作る、もしくはnullを代入する・・・
unsetは、シンボルテーブルから対象変数を取り除く・・・
ってかんじのようです。
var_dumpで出力するとどっちもnull出しますが・・・。
たとえば、配列の一部をunsetした場合、null代入した場合ではforeachでの動作が変わります。
null代入の場合は、シンボルテーブルには存在するためにforeachで評価されます。
unsetの場合、シンボルテーブルに存在しないため、評価されません。
・・・というのが、漠然とした理解です・・・。
多分もっといろんなことあると思うんですが・・・っ・・・。くわしくなくてすいません。orz
回答ありがとうございました。
配列の一部に対して処理をしてみる、ということに、全く考えが及びませんでした。
早速試してみたところ、明確に違いが確認できました。
大変参考になりましたー
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 …
回答ありがとうございました。
そのまま試しただけだと違いは分からなかったのですが、
この情報で検索してみたところ、
検査用関数を作ったり、色々試しているサイトへたどり着くことができました。
ありがとうございましたー
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だと警告じゃなくてエラーとなりプログラムの実行が中断します。
回答ありがとうございました。
説明大変分かりやすかったです。
>スクリプト言語でも、RubyやJavaScriptだと警告じゃなくてエラーとなりプログラムの実行が中断します
こういった情報も、大変参考になりましたー
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
?>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<A href ~で複数の値を渡したい
-
テーブルに送信ボタンをつける
-
「取得先」という表現について
-
Dosブロンプトでtabを出力したい
-
IPアドレスとMACアドレスを取得...
-
【C#】DataGridViewの最大列数...
-
excel access連携 このテーブル...
-
format関数について
-
バッチファイルでpingの結果を...
-
DTOとEntityの差は何ですか。
-
Windowsのsetコマンドでの小数...
-
PHPを使って、別サイトの一部を...
-
findstrのerrorlevel
-
asp.netでのセッションを使用し...
-
shシェルスクリプト 空白行の...
-
php history.back()の戻るボタ...
-
VBA コレクションに2次元配列...
-
表示している画面サイズの取得方法
-
二重ログイン管理について
-
コンビニで住民票を取得した場...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printの出力結果を変数に代入す...
-
以下のプログラムで質問します。
-
whileループの中でフォーム入力...
-
はじめまして。
-
関数の実行ができません
-
phpスクリプトについて
-
PHPで変数についての質問です
-
【PHP】条件が一致したとき...
-
WEB経由のPHPによるSQLServer接...
-
「次の10件を表示する」のよ...
-
関数戻り値が連想配列の場合
-
文字列の比較がうまくいきません。
-
CGIで何%の指示の仕方
-
テーブルに送信ボタンをつける
-
以下エラーメッセージ解決法は
-
日付の比較について
-
$_SERVER["QUERY_STRING"]の仕...
-
PHPの質問です : -> 等
-
「#表を定義し外枠サイズ2を定...
-
郵便番号と一致するか調べるプ...
おすすめ情報