関数の中で全てのグローバル変数を使う

関数内ではグローバル変数が使えない

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という変数が定義されることが分かります!

コメント

タイトルとURLをコピーしました