PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPの変数スコープを徹底解説!global・$GLOBALS・staticの使い方

変数スコープとは

プログラミングにおける「スコープ(scope)」とは、変数が参照・アクセスできる範囲のことです。ループや関数などの構造を持たないシンプルなPHPスクリプトでは、基本的にスコープは1つだけです。つまり、変数は定義された箇所以降、プログラム全体で利用できます。

また、メインスクリプトで定義された変数は、include文やrequire文で読み込まれた他のスクリプトからもアクセスできます。次の例では、メインスクリプトからtest.phpを読み込んでいます。

メインスクリプト:

$var=100;
include "test.php";
?>

読み込まれるtest.phpの内容は以下のとおりです。

echo "testscript.php 内の \$var の値 : " . $var;
?>

メインスクリプトを実行すると、次の結果が表示されます。

testscript.php 内の $var の値 : 100

関数内の変数はローカルスコープ

一方、ユーザー定義関数が含まれるスクリプトでは、関数内の変数は「ローカルスコープ」を持ちます。そのため、関数内で定義された変数は外部からアクセスできません。逆に、関数の外で定義された変数は「グローバルスコープ」を持ちます。

<?php
$var=100; //グローバル変数
function myfunction(){
    $var1="Hello"; //ローカル変数
    echo "var=$var var1=$var1" . "\n";
}
myfunction();
echo "var=$var var1=$var1" . "\n";
?>

出力結果

var= var1=Hello
var=100 var1=
PHP Notice: Undefined variable: var in line 5
PHP Notice: Undefined variable: var1 in line 8

このように、グローバル変数は関数内のローカルスコープから自動的には利用できず、逆に関数内の変数も外部からはアクセスできない点に注意してください。

globalキーワード

関数内からグローバル変数にアクセスするには、globalキーワードを使って明示的に宣言する必要があります。

<?php
$a=10;
$b=20;
echo "関数呼び出し前 a = $a b = $b" . "\n";
function myfunction(){
    global $a, $b;
    $c=($a+$b)/2;
    echo "関数内 a = $a b = $b c = $c" . "\n";
    $a=$a+10;
}
myfunction();
echo "関数呼び出し後 a = $a b = $b c = $c";
?>

出力結果

関数呼び出し前 a = 10 b = 20
関数内 a = 10 b = 20 c = 15
PHP Notice: Undefined variable: c in line 13
関数呼び出し後 a = 20 b = 20 c =

globalキーワードを使えば、関数内でグローバル変数を操作できます。さらに、関数内で行った変更はグローバル空間にも反映されます。上の例では、関数内で$aに10を加算した結果、関数の外でも$aが20になっていることが確認できます。

$GLOBALS配列

PHPは、すべてのグローバル変数を「$GLOBALS」という連想配列に格納しています。変数名がキー、変数の値が値となるキー・バリューのペアで構成されます。

次のスクリプトでは、$GLOBALS配列を使ってグローバル変数にアクセスしています。

<?php
$a=10;
$b=20;
echo "関数呼び出し前 a = $a b = $b" . "\n";
function myfunction(){
    $c=($GLOBALS['a']+$GLOBALS['b'])/2;
    echo "c = $c" . "\n";
    $GLOBALS['a']+=10;
}
myfunction();
echo "関数呼び出し後 a = $a b = $b c = $c";
?>

出力結果

関数呼び出し前 a = 10 b = 20
c = 15
PHP Notice: Undefined variable: c in line 12
関数呼び出し後 a = 20 b = 20 c =

static変数(静的変数)

staticキーワードで定義された変数は、関数が呼び出されるたびに初期化されることはありません。さらに、前回の呼び出し時の値を保持し続けます。

<?php
function myfunction(){
    static $x=0;
    echo "x = $x" . "\n";
    $x++;
}
for ($i=1; $i<=3; $i++){
    echo "関数呼び出し :$i 回目 : ";
    myfunction();
}
?>

出力結果

関数呼び出し :1 回目 : x = 0
関数呼び出し :2 回目 : x = 1
関数呼び出し :3 回目 : x = 2

このようにstatic変数を活用すると、関数の呼び出し回数を数えるカウンターなど、呼び出し間で値を保持したい処理を簡単に実装できます。

  1. PHPのfilter_input()関数とは?使い方とパラメータを解説

    PHPのfilter_input()関数は、GETやPOSTなど外部から送信された変数を名前で取得し、必要に応じてフィルタリング(検証・サニタイズ)を行うことができる関数です。ユーザー入力を安全に扱うための重要な関数の一つであり、セキュリティ対策の観点からも広く利用されています。構文filter_input(type, var, filtername, options)パラメータtype − チェック対象となる入力の種類を指定します。指定できるのは以下の5種類です。INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER、INPUT_ENVvar − 取得し

  2. PHPのextract()関数とは?使い方とパラメータを徹底解説

    extract()関数とはPHPのextract()関数は、配列のキーと値を現在のシンボルテーブルに変数としてインポートする関数です。連想配列の各要素が「キー名=変数名、値=変数の値」として展開され、戻り値としては正常に抽出された変数の個数が返されます。構文extract(arr, rules, prefix)パラメータarr − 変数として展開したい対象の配列を指定します。rules − 無効な変数名や既存変数との衝突(コンフリクト)が発生した場合の扱い方を指定します。指定できる値は以下の通りです。EXTR_OVERWRITE − デフォルト値。同名の変数が既に存在する場合、既存の変数を上書