@ PHP

function:変数のスコープ

関数の外側で定義された変数はグローバル変数と呼ばれ、1つのスコープの中にあります。関数の内部で定義された変数はローカル変数と呼ばれます。

それぞれ関数は別々のスコープを持っています。

functions_17.php では、vegetarian_dinner() 関数 も function kosher_dinne() 関数も $dinner が関数内の値に設定される前は、値を持っていません。

グローバル変数 $dinner は関数内に影響を与えません。

各関数内では、$dinner は $dinner のローカル版を参照するので、他の関数の同じ名前を持つ変数とは完全にわかれています。

最初の print 命令文は Undefined variable: dinner とPHPに警告されます。

functions_17.php

<?php
$dinner = 'コウイカのカレー';
function vegetarian_dinner() {
    print "ディナー: $dinner";
    $dinner = '豆苗炒め';
    print $dinner;
    print "<br>\n";
}

function kosher_dinne() {
    print "ディナー: $dinner";
    $dinner = '鶏肉とピーナッツの炒め物';
    print $dinner;
    print "<br>\n";
}

print "ベジタリアン";
vegetarian_dinner();
print " コーシャ";
kosher_dinne();
print "レギュラーディナー: $dinner";
?>

$GLOBALS 配列

関数内からグローバル変数にアクセスする方法は2通りあります。最も分かりやすい方法は $GLOBALS と呼ばれる特別な配列を探すことです。各グローバル変数はこの配列にある要素にアクセスできます。

functions_18.php では関数内でグローバル変数の $dinner に $GLOBALS[‘dinner’] としてアクセスします。

functions_18.php

<?php
$dinner = 'コウイカのカレー';
function macrobiotic_dinner() {
    $dinner = "ベジタブル";
    print "マクロビオティックなディナーは$dinner";
    print "だけれども、";
    print $GLOBALS['dinner'];
    print "が食べたい。<br>\n";
}
macrobiotic_dinner();
print "レギュラーディナー: $dinner";
?>

$GLOVALS 配列の変数を修正する

#GLOBALS 配列でグローバル変数を修正することもできます。

functions_19.php の hungry_dinner() 関数内では、$GLOBALS[‘dinner’] を修正して、結合演算子を使い $GLOBALS[‘dinner’]に 「と サトイモの揚げ物」を連結します。

functions_19.php

<?php
$dinner = 'コウイカのカレー';
function hungry_dinner() {
    $GLOBALS['dinner'].=' と サトイモの揚げ物';
}
print "レギュラーディナー:$dinner";
print "
\n"; hungry_dinner(); print "スペシャルディナー:$dinner"; ?>

gloval キーワード

関数内でグローバル変数にアクセスする2番目の方法は、gloval キーワードを使うことです。

この方法は、関数内で gloval キーワードで指定された変数を使うときに、ローカル変数ではなくグローバル変数を参照するように PHP にしらせます。この操作を「変数をローカルスコープに持ち込む」といいます。

functions_20.php では、最初の pritn 命令文はグローバル変数 $dinner の修正されていない値を表示します。

vegetarian_dinner() の中で global $dinner の意味は、関数内の $dinner を使う時に同じ名前を持つローカル変数ではなく、グローバル変数を参照するようにすることです。

代入式 $dinner = ‘豆苗炒め’; は、グローバル変数 $dinner へ「豆苗炒め」を代入します。

グローバル変数 $dinner は関数内で変換されるので、最後の print 命令文は変換された値を出力します。

global キーワードは一度に複数の変数を指定することができ、変数名をカンマでくぎって指定します。

functions_20.php

<?php
$dinner = 'コウイカのカレー';
function vegetarian_dinner() {
    global $dinner;
    print "きょうのディナーは、$dinner から";
    $dinner = '豆苗炒め';
    print $dinner;
    print "に変わりました。<br>\n";
}

print "レギュラーディナー:$dinner<br>\n";
vegetarian_dinner();
print "レギュラーディナー:$dinner";
?>

静的変数

ローカル変数の有効範囲は関数の中だけです。関数の処理が終了するタイミングで、ローカル変数は破棄されてしまいます。

static 命令で静的変数として定義された変数は、関数の初回呼び出し時のみに初期化され、その後関数の処理が終了しても維持されます。

functions_21.php

<?php
function order_dinner() {
    $dinner = 'コウイカのカレー';
    static $x =0;
    return $dinner.++$x."<br>\n";
}
print order_dinner();
print order_dinner();
print order_dinner();
?>
?>