関数内で定義した変数がどんな感じか確認した覚書です。
とりあえず、関数を作って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)
}