回答編集履歴
2
コメントを受けて修正
test
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
これらはempty()で判定できますね。
|
15
15
|
|
16
16
|
PHPが (というか前身のPHP/FIのときかもしれませんが) 変数を使えるようになったときに、この「空」であるか否かの判定では不都合が生じました。
|
17
|
-
変数は「名前がついていて、それを値を入れる領域と関連づけてある」ものとして実装されたので、まだ一度も値を代入していない変数 (値を入れる領域がないもの) は「空」です。しかし一度でも値を代入すれば、「空」の値 (前の段落で説明した意味で) を代入してももはや「空ではない」ことになります。
|
17
|
+
*当初*、変数は「名前がついていて、それを値を入れる領域と関連づけてある」ものとして実装されたので、まだ一度も値を代入していない変数 (値を入れる領域がないもの) は「空」です。しかし一度でも値を代入すれば、「空」の値 (前の段落で説明した意味で) を代入してももはや「空ではない」ことになります。
|
18
18
|
これでは困るので、変数の値を未定義にできるようにunset()を、未定義かどうかの判定にisset()を導入しました。
|
19
19
|
|
20
20
|
ここでnullが必要になります。未定義の変数から値を取り出そうとするとブログラムが止まってしまうのも不都合なので、そういう場合はあたかも「何もないという値」が代入されていて、それが取り出されたかのように動作させることにしました。この「何もないという値」とみなせるものをnullと呼ぶことにし、後に (おそらく他の言語の仕様を参考に)「null型という型の唯一の値」という定義を与えました。
|
@@ -25,3 +25,7 @@
|
|
25
25
|
|
26
26
|
通常なら「null型というものがあってだな、」と、天下り式に言語仕様を説明すればいいと思うのですが、PHPの場合は上にも書いたように仕様の建て増しを繰り返してきており、その楽屋裏が初学者にも垣間見えてしまって混乱させるようなところがあるため、経緯の説明を試みてみました。
|
27
27
|
|
28
|
+
---
|
29
|
+
|
30
|
+
\[追記] コメントを受け、「当初」という言葉を補いました。今の変数やempty()の挙動はまた異なります。
|
31
|
+
|
1
切れたので投稿し直し
test
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
PHPの場合から類推して考えていらっしゃるのだと思うので、PHPについて説明しますね。
|
2
|
+
|
3
|
+
※注意してほしいのですが、以下の説明はPHPに関するもので、他の言語には必ずしも当てはまりません。
|
2
4
|
|
3
5
|
> あるとき、世のプログラマーたちは、
|
4
6
|
> 「あらゆる種類の値に、2種類の『状態』をもたせたい」と考えた。
|
@@ -7,13 +9,19 @@
|
|
7
9
|
|
8
10
|
最初から「null型」といった抽象的なものを考えてそれを作ろうとしたわけではありません。というか、PHPは他のいろいな言語からパクってきた概念で自分自身の言語仕様を説明する、ということを非常によくやりますが、「null型」もそうした後付けの説明のひとつにすぎません。
|
9
11
|
|
10
|
-
もともとは、空であるか否か、つまり「あるデータがメモリ上の一定の領域を占めているか否か」を判定
|
12
|
+
もともとは、「空」であるか否か、つまり「あるデータがメモリ上の一定の領域を占めているか否か」を判定していました。
|
11
|
-
この場合、
|
13
|
+
この場合、数値は一定の長さのバイト列で表されるので全て「空ではない」ことになり、文字列は長さがゼロなら「空」、長さがあれば「空ではない」、ということになりました。
|
12
14
|
これらはempty()で判定できますね。
|
13
15
|
|
14
|
-
PHP (というか前身のPHP/FIのとき
|
16
|
+
PHPが (というか前身のPHP/FIのときかもしれませんが) 変数を使えるようになったときに、この「空」であるか否かの判定では不都合が生じました。
|
15
|
-
変数は「名前がついていて、値を入れる領域と関連づけてある」ものとして実装されたので、まだ一度も値を代入していない変数 (値を入れる領域がないもの) は空です。しかし一度でも値を代入すれば、
|
17
|
+
変数は「名前がついていて、それを値を入れる領域と関連づけてある」ものとして実装されたので、まだ一度も値を代入していない変数 (値を入れる領域がないもの) は「空」です。しかし一度でも値を代入すれば、「空」の値 (前の段落で説明した意味で) を代入してももはや「空ではない」ことになります。
|
16
|
-
これでは困るので、変数の値を未定義にできるようにunset()を、未定義かどうかの判定にisset()を導入しました。
|
18
|
+
これでは困るので、変数の値を未定義にできるようにunset()を、未定義かどうかの判定にisset()を導入しました。
|
17
19
|
|
18
|
-
null
|
20
|
+
ここでnullが必要になります。未定義の変数から値を取り出そうとするとブログラムが止まってしまうのも不都合なので、そういう場合はあたかも「何もないという値」が代入されていて、それが取り出されたかのように動作させることにしました。この「何もないという値」とみなせるものをnullと呼ぶことにし、後に (おそらく他の言語の仕様を参考に)「null型という型の唯一の値」という定義を与えました。
|
19
21
|
|
22
|
+
以上のようなわけで、PHPのnullは「未定義値を表すもの」と理解しておけばいいと思います。
|
23
|
+
|
24
|
+
---
|
25
|
+
|
26
|
+
通常なら「null型というものがあってだな、」と、天下り式に言語仕様を説明すればいいと思うのですが、PHPの場合は上にも書いたように仕様の建て増しを繰り返してきており、その楽屋裏が初学者にも垣間見えてしまって混乱させるようなところがあるため、経緯の説明を試みてみました。
|
27
|
+
|