回答編集履歴

2

コメントを受けて修正

2019/03/23 08:07

投稿

ikedas
ikedas

スコア4337

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

切れたので投稿し直し

2019/03/23 08:07

投稿

ikedas
ikedas

スコア4337

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
+