
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で質問しましょう!
似たような質問が見つかりました
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- PHP データベースを用いたwebページ 1 2022/12/27 20:12
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Perl 画像が表示でnull; this.src 1 2022/04/19 11:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP ハイパーリンク
-
Dosブロンプトでtabを出力したい
-
「取得先」という表現について
-
shシェルスクリプト 空白行の...
-
EXCEL、マクロ-改ページ行番号...
-
バッチファイルでpingの結果を...
-
VB.NETでボリュームを取得・設...
-
【C#】DataGridViewの最大列数...
-
URLのパラメータをGETのままで...
-
switch()文で値の大小比較
-
コンビニで住民票を取得した場...
-
PHP SESSION変数を複数使用でき...
-
syntax error, unexpected 'ech...
-
どういうプログラムを関数化を...
-
excel access連携 このテーブル...
-
VB.NETからVBAマクロ(引数)を呼...
-
VisualBasic2010のPictureBoxに...
-
ASPのResponse.WriteをPHPでは...
-
PHPの名前空間インポートについて
-
VB.NETで画像の拡大・縮小
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブルに送信ボタンをつける
-
「次の10件を表示する」のよ...
-
if文について
-
CakePHP リッチテキストエディ...
-
二つの条件が不等価の場合の記述
-
以下のエラーメッセージ解決法...
-
PHPにて自動計算した値をデータ...
-
「ソースコードは 左~右へと読...
-
!==について
-
PHPの基本的な作法について
-
PHP ハイパーリンク
-
POSTされたかどうか確かめる方...
-
<python>importについて
-
null代入とunset()の違いについて
-
頭が混乱。submitからデータが...
-
<A href ~で複数の値を渡したい
-
ダブルクォーテーションで囲ま...
-
デバッグ用関数について
-
逆順表示したい?
-
vbYesNoの使い方
おすすめ情報