回答編集履歴
5
なぜ000なのか追加
answer
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
## 宣言の仕方
|
25
25
|
どの変数がどれになるかは最初の宣言の場所と宣言の仕方によって異なります。例えば、PHPの場合、関数外で宣言すればグローバルスコープに、関数内で宣言すれば関数スコープになります。また、関数スコープの変数に`static`を付けると静的になります。
|
26
26
|
|
27
|
-
では、出力が012になるようにPHPを修正する例を二つあげます。
|
27
|
+
質問で書いているPHPのコードにおいて、`$b`はただのローカル変数です。関数内でしか見えず、かつライフサイクルは**自動**になりますので、関数終了時に自動的に破棄されます。そのため、毎回0で初期化されるため、出力が000になったのです。では、出力が012になるようにPHPを修正する例を二つあげます。
|
28
28
|
|
29
29
|
1. グローバル変数を使う。
|
30
30
|
```PHP
|
4
もうちょっと修正
answer
CHANGED
@@ -21,8 +21,8 @@
|
|
21
21
|
2. 静的: プログラム開始時または該当するスコープのロード時に生成され、プログラム終了時または該当するスコープ自体の破棄に破棄されます。宣言時に静的であるとした場合や、クラススコープが該当します。ローカル変数のうち静的な場合を区別して**静的ローカル変数**とよぶます。
|
22
22
|
|
23
23
|
言語によって、細かい動作が異なります。静的ローカル変数が用意されていない言語もあります。
|
24
|
-
## 宣言
|
24
|
+
## 宣言の仕方
|
25
|
-
どの変数がどれになるかは最初の宣言の場所と宣言の仕方によって異なります。
|
25
|
+
どの変数がどれになるかは最初の宣言の場所と宣言の仕方によって異なります。例えば、PHPの場合、関数外で宣言すればグローバルスコープに、関数内で宣言すれば関数スコープになります。また、関数スコープの変数に`static`を付けると静的になります。
|
26
26
|
|
27
27
|
では、出力が012になるようにPHPを修正する例を二つあげます。
|
28
28
|
|
3
さらにみやすく・・・あまりなっていない><
answer
CHANGED
@@ -17,8 +17,8 @@
|
|
17
17
|
変数のライフサイクルとはいつ生成されていつ破棄されるかです。スコープによって動作が異なります。
|
18
18
|
- グローバルスコープ: プログラム開始時または宣言時やライブラリのロード時に生成されます。明示的に破棄しない限り、プログラムが終了するまで破棄されることはありません。
|
19
19
|
- ローカルスコープ: 大きく自動(auto)と静的(static)に分かれます。
|
20
|
-
|
20
|
+
1. 自動: 該当するスコープ開始時(関数スコープであれば関数開始時)または宣言時に生成されます。ほとんどの場合は、スコープ終了時に自動的に破棄されます。ほとんどの変数がこれに該当します。
|
21
|
-
|
21
|
+
2. 静的: プログラム開始時または該当するスコープのロード時に生成され、プログラム終了時または該当するスコープ自体の破棄に破棄されます。宣言時に静的であるとした場合や、クラススコープが該当します。ローカル変数のうち静的な場合を区別して**静的ローカル変数**とよぶます。
|
22
22
|
|
23
23
|
言語によって、細かい動作が異なります。静的ローカル変数が用意されていない言語もあります。
|
24
24
|
## 宣言
|
2
ちょっとみにくかったの修正
answer
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
これは名前空間と言うより、変数のスコープとライフサイクルのお話です。
|
2
2
|
## スコープ
|
3
3
|
ほとんどの言語には変数にスコープというのがあります。スコープというのはその変数が「見える場所はどこか」ということです。スコープは大きく分けると二つです。
|
4
|
-
- グローバルスコープ: プログラムのどこからでも見えるスコープです。言語によってはそのまま使える場合と、関数内で使用する場合は何かしらの宣言やプリフィックス等を付ける必要がある場合があります。
|
4
|
+
- グローバルスコープ: プログラムのどこからでも見えるスコープです。言語によってはそのままどこでも使える場合と、関数内等で使用する場合は何かしらの宣言やプリフィックス等を付ける必要がある場合があります。更に分けると2種類あります。
|
5
|
-
|
5
|
+
1. グローバルスコープ: 他のライブラリやソースファイルからもどこからでも見えます。**グローバル変数**と呼びます。
|
6
|
-
|
6
|
+
2. ファイルスコープ: そのプログラムのファイル内でのみ見えます。採用している言語は少なく、C/C++ぐらいです。こちらも**グローバル変数**と呼ぶのですが、区別する場合はC/C++で`static`をつけることから**静的グローバル変数**(言葉の意味としてはまったくもってよくわからないのですが)と呼ばれることもあります。
|
7
|
-
- ローカルスコープ: ある特定の範囲内でのみ見えるスコープです。
|
7
|
+
- ローカルスコープ: ある特定の範囲内でのみ見えるスコープです。更に分けると4種類あります。
|
8
|
-
|
8
|
+
1. 関数スコープ: その関数内でのみ見えます。**ローカル変数**と呼ばれます。
|
9
|
-
|
9
|
+
2. ブロックスコープ: そのブロック(例えば、for文の中とか、何がブロックを構成するかは言語によって異なる)でのみ見えます。こちらも**ローカル変数**と呼ばれます。関数スコープと区別して**ブロックローカル変数**と呼ぶ場合もあります。
|
10
|
-
|
10
|
+
3. クラススコープ: クラスとそのクラスのインスタンスから見えます。基本的にはクラスとインスタンスで共用されます。**クラス変数**と呼ばれます。
|
11
|
-
|
11
|
+
4. インスタンススコープ: インスタンスでのみ見えます。基本的にはインスタンス毎に別々に持ちます。**インスタンス変数**と呼ばれます。
|
12
12
|
|
13
13
|
各スコープにおいて、見える範囲が異なれば、名前空間が異なるようになります。同じ名前を付けても、別のものとして扱います。
|
14
14
|
|
1
改行とかがおかしかった
answer
CHANGED
@@ -8,9 +8,10 @@
|
|
8
8
|
1. 関数スコープ: その関数内でのみ見えます。**ローカル変数**と呼ばれます。
|
9
9
|
2. ブロックスコープ: そのブロック(例えば、for文の中とか、何がブロックを構成するかは言語によって異なる)でのみ見えます。こちらも**ローカル変数**と呼ばれます。関数スコープと区別して**ブロックローカル変数**と呼ぶ場合もあります。
|
10
10
|
3. クラススコープ: クラスとそのクラスのインスタンスから見えます。基本的にはクラスとインスタンスで共用されます。**クラス変数**と呼ばれます。
|
11
|
-
4. インスタンススコープ: インスタンスでのみ見えます。基本的にはインスタンス毎に別々に持ちます。
|
11
|
+
4. インスタンススコープ: インスタンスでのみ見えます。基本的にはインスタンス毎に別々に持ちます。**インスタンス変数**と呼ばれます。
|
12
|
-
各スコープにおいて、見える範囲が異なれば、名前空間が異なるようになります。同じ名前を付けても、別のものとして扱います。**インスタンス変数**と呼ばれます。
|
13
12
|
|
13
|
+
各スコープにおいて、見える範囲が異なれば、名前空間が異なるようになります。同じ名前を付けても、別のものとして扱います。
|
14
|
+
|
14
15
|
言語によっては、全てのスコープが用意されているわけではありません。
|
15
16
|
## ライフサイクル
|
16
17
|
変数のライフサイクルとはいつ生成されていつ破棄されるかです。スコープによって動作が異なります。
|