PHP変数スコープ
はじめに
プログラミングでは、スコープとは変数にアクセスできる範囲を指します。一般に、単純なPHPスクリプト(ループや関数などの構造を含まない)には単一のスコープがあり、ある意味では、定義の時点からプログラム全体で変数を使用できます。
メインスクリプトの変数は、includeステートメントまたはrequireステートメントが組み込まれている他のスクリプトでも使用できます。次の例では、test.phpスクリプトがメインスクリプトに含まれています。
これがメインスクリプトです
$var=100; include "test.php"; ?>
含まれているファイルtest.scriptは次のとおりです-
echo "value of of \$var in testscript.php : " . $var; ?>
メインスクリプトを実行すると、以下の結果が表示されます
value of of $var in testscript.php : 100
ただし、スクリプトにユーザー定義関数がある場合、内部の変数にはローカルスコープがあります。その結果、関数内で定義された変数に外部からアクセスすることはできません。関数の外部(上)で定義された変数にはグローバルスコープがあります。
例
<?php $var=100; //global variable function myfunction(){ $var1="Hello"; //local variable 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キーワードを使用して明示的に有効にする必要があります。 PHPスクリプトは次のとおりです-
例
<?php $a=10; $b=20; echo "before function call a = $a b = $b" . "\n"; function myfunction(){ global $a, $b; $c=($a+$b)/2; echo "inside function a = $a b = $b c = $c" . "\n"; $a=$a+10; } myfunction(); echo "after function a = $a b = $b c = $c"; ?>
出力
これにより、次の結果が生成されます-
before function call a = 10 b = 20 inside function a = 10 b = 20 c = 15 PHP Notice: Undefined variable: c in line 13 after function a = 20 b = 20 c =
グローバル変数を関数内で処理できるようになりました。さらに、関数内のグローバル変数に加えられた変更は、グローバル名前空間に反映されます
$GLOBALS配列
PHPは、すべてのグローバル変数を$GLOBALSと呼ばれる連想配列に格納します。変数の名前と値は、キーと値のペアを形成します
次のPHPスクリプトでは、$GLOBALS配列を使用してグローバル変数にアクセスします-
例
<?php $a=10; $b=20; echo "before function call a = $a b = $b" . "\n"; function myfunction(){ $c=($GLOBALS['a']+$GLOBALS['b'])/2; echo "c = $c" . "\n"; $GLOBALS['a']+=10; } myfunction(); echo "after function a = $a b = $b c = $c"; ?>
出力
before function call a = 10 b = 20 c = 15 PHP Notice: Undefined variable: c line 12 Notice: Undefined variable: c in line 12 after function a = 20 b = 20 c =
静的変数
staticキーワードで定義された変数は、関数を呼び出すたびに初期化されるわけではありません。さらに、以前の呼び出しの値を保持します
例
<?php function myfunction(){ static $x=0; echo "x = $x" . "\n"; $x++; } for ($i=1; $i<=3; $i++){ echo "call to function :$i : "; myfunction(); } ?>
出力
これにより、次の結果が得られます
call to function :1 : x = 0 call to function :2 : x = 1 call to function :3 : x = 2
-
PHPのfilter_input()関数
filter_input()関数は、外部変数の名前を取得し、オプションでフィルタリングします。 構文 filter_input(type, var, filtername, options) パラメータ タイプ −チェックする入力には、INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER、またはINPUT_ENVの5種類があります。 var −変数の名前。 フィルター名 −IDを取得するためのフィルターの名前。 オプション −使用するオプションを指定します。 戻る filter_input()関数は、成功した場合は変数の
-
PHPのextract()関数
extract()関数は、変数を配列から現在のシンボルテーブルにインポートします。正常に抽出された変数の数を返します。 構文 extract(arr, rules, prefix) パラメータ 到着 −指定された配列 ルール −無効な変数名の処理方法を指定します。可能な値は次のとおりです- EXTR_OVERWRITE −デフォルト。衝突すると、既存の変数が上書きされます EXTR_SKIP −衝突時に、既存の変数は上書きされません EXTR_PREFIX_SAME −衝突時に、変数名にプレフィックスが付けられます EXTR_PREFIX_