PHP7.4.1における変数のスコープについて。
//①関数の中か外かで変数の参照の仕方(スコープ)が違う
$ab = 10;
$ac = 20;
function aaa($a1, $a2) {
$aa = $a1 + $a2; //$a1と$a2はスコープ内だからOK(30)
$bb =$ab + $ac; //$abと$acはスコープ外だからNotice(Error)
return $aa;
}
$ad = aaa($ab, $ac);
echo $ad; //$adはスコープ内だからOK(30)
echo $aa; //$aaはスコープ外だからNotice(Error)
//②global宣言をしてスコープを貫通させる
$ba = 10;
$bc = 20;
function bbb($b1, $b2) {
global $ba, $bc; //$abと$acのglobal宣言
$bb = $b1 + $b2; //$a1と$a2はスコープ内だからOK(30)
$cc = $ba + $bc; //global宣言により$abと$acもスコープ内となる(30)
return $bb + $cc; //60
}
$bd = bbb($ba, $bc);
global $bb; //$aaのglobal宣言(このパターンは無理)
echo $bd; //$adはスコープ内だからOK(30)
echo $bb; //Errorは出ないが無視される
変数のスコープとは、ある変数が使える有効範囲のことです。
変数にはローカル変数とグローバル変数の2種類があります。
ローカル変数は、ある関数内で宣言した変数のことです。
グローバル変数は、関数の外で宣言した変数のことです。
ローカル変数のスコープはその関数内のみです。
なので、上記①のスクリプトのローカル変数である$aaは関数外で参照するとNotice Errorとなります。
グローバル変数のスコープは関数の外のみです。
なので、①のグローバル変数である$abと$acをaaa関数内で参照するとNotice Errorとなります。
しかしグローバル変数については、ある関数内でglobal宣言をすることで、その関数内ではスコープ内変数としてあつかうことができます。
ではこれと同じようにローカル変数を関数の外でglobal宣言したら関数の外でその変数が使えるようになるのかというと、これはなりません。
global宣言でスコープを貫通できるのはグローバル変数だけです。
グローバル宣言の定形は以下のとおりです。
global 変数名, 変数名, 変数名;
global宣言したい変数が複数ある場合はカンマでつないで書きます。
ひとつしかglobal宣言しない場合はカンマは必要ありません。
また、スコープが違う場合は同じ変数名を別個体の変数として使うことが可能です。
つまり、ローカル変数$aaとグローバル変数$aaはそれぞれ違う値を代入できるということです。
もちろん、a関数とb関数という2種類の異なる関数内で同じ名前のローカル変数$aaを宣言したとしても、その$aaはa関数のローカル変数とb関数のローカル変数という形で別個体としてあつかわれます。
以上です。