関数内で定義した変数がどんな感じか確認した覚書です。
とりあえず、関数を作ってvar_dumpで出力してみる。
<?php
function array_add($var) {
$hoge[] = $var;
}
array_add('one');
var_dump($hoge);
これでOKかと思いますが、Notice: Undefined variable: hoge ...というエラーが表示されます。
Notice(ノーティス) は注意、Undefined(アンディファインド)は未定義、variable(ヴェアリアブル)は変数という意味なので、hogeという変数が未定義だよと注意されています。
関数内に$hogeと記述していますが、これはローカル変数のため、有効範囲は関数内になります。
変数の前に globalと記述するとグローバル変数になります。
先ほどの記述に global を追加します。
<?php
function array_add($var) {
global $hoge[] = $var;
}
array_add('one');
var_dump($hoge);
これでOKかと思いますが、今度は Parse error: syntax error, unexpected ...というエラーが表示されます。
Parse(パース)は構文解析、syntax(シンタックス)は文法という意味なので、書き方に誤りがあるから意味わからないと言われています。
globalは、変数を使う前にグローバルだよーと教えてあげる必要があります。
先ほどの記述を修正すると下記になります。
<?php
function array_add($var) {
global $hoge;
$hoge[] = $var;
}
array_add('one');
var_dump($hoge);
最初に global $hoge と教えてあげれば、グローバル変数だと理解するので、同じ関数内なら、そのあと使うときにglobalを付ける必要はありません。
これでエラーなく配列に追加されます。
array(1) {
[0]=>
string(3) "one"
}
通常、関数内に記述した変数はローカル変数ですが、globalを付けることで、グローバル変数になりました。
通常、関数の外に記述した変数は、グローバル変数です。
array_add関数を使って追加したあとに、$hoge[] = 'two'; と記述すれば、同じグローバル変数なので、追加されるはずです。
試してみます。
<?php
function array_add($var) {
global $hoge;
$hoge[] = $var;
}
array_add('one');
$hoge[] = 'two';
var_dump($hoge);
予想通り、追加されました。
array(2) {
[0]=>
string(3) "one"
[1]=>
string(3) "two"
}
今度は、array_add関数を記述する前に $hoge[] = 'zero'; を記述してみます。
<?php
$hoge[] = 'zero';
function array_add($var) {
global $hoge;
$hoge[] = $var;
}
array_add('one');
$hoge[] = 'two';
var_dump($hoge);
関数の外にある$hogeも関数の中にある$hogeも同じグローバル変数の$hogeを指しているので、array_add関数の前に記述した$hoge[] = 'zero';も追加されて表示されます。
array(3) {
[0]=>
string(4) "zero"
[1]=>
string(3) "one"
[2]=>
string(3) "two"
}
まとめ
- 普通に書いた変数は、グローバル変数だが、関数内に記述した変数はローカル変数(同じ変数名にしても別々の変数)
- グローバル変数にするには、変数名の前に
globalを記述する - 事前に
グローバルだよと教える必要があるので、global $hoge;のように変数を使う前に記述する
おまけ
$GLOBALSにグローバルスコープで使用可能なすべての変数が格納されています。
記述したグローバル変数が格納されているか確認しましょう。
<?php
$alpha = 1;
$beta = 2;
$gammma = 3;
var_dump($GLOBALS);
表示結果を見るとわかりますが、最後の方に追加した$alpha、$beta、$gammmaが$GLOBALSに格納されています。
記述してない_GETや_POSTなどは、最初からPHPに定義されているグローバル変数です。
array(8) {
["_GET"]=>
array(0) {
}
["_POST"]=>
array(0) {
}
["_COOKIE"]=>
array(0) {
}
["_FILES"]=>
array(0) {
}
["GLOBALS"]=>
*RECURSION*
["alpha"]=>
int(1)
["beta"]=>
int(2)
["gammma"]=>
int(3)
}