関数内ではグローバル変数が使えない
PHPでは、関数内でグローバル変数が使えません。
次のように関数外で$strという変数を定義して、関数内でそれを表示させるプログラムを考えてみます。
$str = ‘Hello World!’;
hello();function hello() {
echo $str;
}
これを実行しても、$strという変数は定義されていないというNOTICEエラーが出るか、何も表示されません。
globalを宣言
関数内と関数外の変数は完全に切り離されているので、関数外で定義した変数を使いたい場合には、それを宣言しなければなりません。
$str = ‘Hello World!’;
hello();function hello() {
global $str;
echo $str;
}
このように、globalを宣言すれば、関数外の変数を関数内に持ち込むことができます。
これでとりあえずHello Worldが表示できます。
関数外の全ての変数を自由に使いたい場合
今回は、関数内で使う変数が$strだけと分かっていたがのでglobalが使えましたが、関数内で使う変数が分からない場合もあります。
もう思い切って、グローバルで宣言した変数を全て使いたい場合、次のようにextract($GLOBALS)と書いてしまうという方法があります。
$str = ‘Hello World!’;
hello();function hello() {
extract($GLOBALS);
echo $str;
}
※注意!これを使えば関数内で全てのグローバル変数を読みだすことはできますが、書き換えることはできません。関数の引数でいうところの値渡しの状態です。
extract関数
extract関数は、連想配列を変数に展開する面白い関数です。
$array=array(‘h’=>’Hello ‘,’w’=>’World!’);
extract($array);
echo $h.$w;
// Hello Wolrd!
こんなプログラムでHello Worldが出力できます。
$hと$wはどこで定義されているかと思うのですが、連想配列のキーにhとwがあるので、これがextract関数で変数に変換されます。
$GLOBALS変数
$GLOBALS変数は自動的に定義される変数です。なおかつスーパーグローバル変数で、関数の中でも宣言なしに自由に使えます。
その実態は、グローバルスコープで宣言された変数の連想配列です。
$str = ‘Hello World!’;
hello();function hello() {
print_r($GLOBALS);
}
このように、関数内で$GLOBALSを書き出してみます。
Array
(
[GLOBALS] => Array
*RECURSION*
[_POST] => Array
(
)[_GET] => Array
(
)・・・(中略)・・・
[str] => Hello World!
)
長いので一部省略しますが、$GLOBALSは連想配列になっていて、$_POSTや$_GETなどのスーパーグローバル変数も、ここには記録されています。
注目すべきは、最後のstrという要素です。グローバルスコープで定義した変数は、このような形で$GLOBALSに保持されます。
これと、extractを組み合わせれば、関数内に$strという変数が定義されることが分かります!
コメント