PHP 変数の詳細な分析scope_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:09:17
オリジナル
767 人が閲覧しました

PHP のすべての変数には、その変数に固有のスコープがあります。これは、変数 (およびその値) にアクセスできる領域です。まず、変数のスコープは変数が存在するページです。したがって、$var を定義すると、ページの残りの部分は $var にアクセスできますが、他のページは通常 (特別な変数が使用されない限り) $var にアクセスできません。

インクルード ファイルは元の (インクルードされた) スクリプトの一部であるかのように動作するため、include() 行の前に定義された変数はインクルードされたファイルで使用できます。さらに、インクルード ファイル内で定義された変数は、include() 行以降の親 (インクルード) スクリプトで使用できます。

独自に定義した関数を使用すると、これらすべてがあまり目立たなくなります。これらの関数には独自のスコープがあります。つまり、関数内で使用される変数は関数の外では使用できず、関数の外で定義された変数は関数内では使用できません。このため、関数内の変数は関数の外側の変数と同じ名前を持つことができますが、それでも値が異なる完全に異なる変数です。これは、ほとんどの初心者プログラマーにとってわかりにくい概念です。
関数内の変数のスコープを変更するには、global ステートメントを使用できます。

コードをコピーします コードは次のとおりです:

Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示http://www.CodeHighlighter.com/-->function function_name() {
global $ var;
}
$var=20;
function_name(); // 関数呼び出し.
?>

この例では、関数内の $var が関数外の $var と同じになります。 。これは、変数 $var の値がすでに 20 であり、この値が関数内で変更されると、関数外の $var の値も変更されることを意味します。
変数スコープを回避するもう 1 つの方法は、スーパーグローバル変数 ($_GET、$_POST、$_REQUEST など) を使用することです。これらの変数は関数内で自動的にアクセスできます (したがって、これらはスーパーグローバル変数です)。 $GLOBALS 配列に要素を追加して、関数内で使用できるようにすることもできます。

言い換えれば、関数内でグローバル変数を使用しないことが最善です。関数を設計するときは、必要に応じてすべての値をパラメータとして受け入れ、必要に応じて任意の値を返すようにする必要があります。関数内でグローバル変数に依存すると、コンテキスト依存性が高まるため、有用性が低くなります。
PHP の変数には主に、組み込みスーパー グローバル変数、一般変数、定数、グローバル変数、静的変数などが含まれます。

組み込みスーパー グローバル変数は、スクリプト内のどこでも使用および表示できます。つまり、PHP ページ内の値の 1 つを変更すると、他の PHP ページで使用されたときにその値も変更されます。

•一度宣言された定数はグローバルに参照可能になります。つまり、関数の内部および外部で使用できますが、これは 1 つのページに含まれる PHP スクリプト (include および include_once で含めた PHP スクリプトを含む) にのみ限定されます。他のページは使用できなくなります。
•スクリプト内で宣言されたグローバル変数はスクリプト全体で参照できますが、関数内では参照できません。関数内の変数がグローバル変数と同じ名前である場合、関数内の変数が優先されます。
•関数内で使用される変数がグローバル変数として宣言されている場合、その名前はグローバル変数の名前と一致している必要があります。この場合、関数内で関数の外にあるグローバル変数を使用することを回避できます。前の状況では、関数内の変数が外部グローバル変数と同じ名前であるため、外部変数は上書きされます。
•関数内で作成され、static として宣言された変数は、関数の外では見ることができませんが、関数の複数回の実行中に値を維持できます。最も一般的なケースは、関数の再帰実行中です。
•関数内で作成された変数は関数に対してローカルであり、関数が終了すると存在しなくなります。
スーパーグローバル変数の完全なリストは次のとおりです:
•.$GOBALS すべてのグローバル変数の配列
•.$_SERVER サーバー環境変数の配列
•.$_POST 経由でこのスクリプトに渡される変数の配列POST メソッド
•.$ _GET GET メソッド経由でスクリプトに渡される変数の配列
•.$_COOKIE Cookie 変数の配列
•.$_FILES ファイルのアップロードに関連する変数の配列
•.$_ENV 環境変数の配列
• .$_REQUEST すべてのユーザーが入力した変数の配列 $_GET $_POST $_COOKIE
•.$_SESSION セッション変数配列
例の説明:
コードをコピー コードは次のとおりです以下に続きます:

Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示 http://www.CodeHighlighter.com/--> $a = 4;
function sendValue($x)
{
echo $x;
}
sendValue($a);
?>

説明: $a は関数の外で定義されており、関数はパラメーターを定義しています。関数が呼び出されるとき、$a はパラメーターの形式で渡されます。したがって、上記のコードは正常に実行できます。
コードをコピーします コードは次のとおりです:

Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示http://www.CodeHighlighter.com/--> $a = 4 ;
function sendValue ()
{h echo $ a;
}
Sendvalue ()? & Gt;


説明: 関数を呼び出すとき、$ a をパラメーターの形式で渡すことはできません。したがって、上記のコードは正常に実行できません。
変数スコープ
変数のスコープとは、変数が定義されているコンテキストのことです(翻訳者:端的に言うと、それはその有効スコープです)。ほとんどの PHP 変数にはスコープが 1 つだけあります。この単一スコープ スパンには、include および require によって導入されたファイルも含まれます。例:


コードをコピーします コードは次のとおりです:
$a = 1;
include "b.inc";
?> ここで、変数 $a は次のようになります。 b.inc で有効になります。ただし、ユーザー定義関数では、ローカル関数スコープが導入されます。関数内で使用される変数は、デフォルトではローカル関数のスコープに制限されます。例:


コードをコピー

コードは次のとおりです:
Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示http://www.CodeHighlighter.com/-->$a = 1; / * グローバル スコープ */function Test()
{
echo $a; /* ローカル スコープ変数への参照 */
}
?>


このスクリプトには出力がありませんなぜなら、echo ステートメントは変数 $a のローカル バージョンを参照しており、このスコープ内の値が割り当てられていないからです。 PHP のグローバル変数は C 言語とは少し異なることに気づくかもしれません。C 言語では、ローカル変数によってオーバーライドされない限り、グローバル変数は関数内で自動的に有効になります。誰かが不用意にグローバル変数を変更する可能性があるため、問題が発生する可能性があります。 PHP のグローバル変数を関数で使用する場合は、グローバル変数を宣言する必要があります。
グローバル キーワード
まず、グローバルの使用例:
例 12-1. グローバルの使用


コードをコピーします

コードは次のとおりです:
Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示http: //www.CodeHighlighter.com/-->$a = 1;$b = 2;function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>


上記のスクリプトの出力は「3」になります。グローバル変数 $a と $b は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。 PHP では、関数が宣言できるグローバル変数の最大数に制限はありません。
グローバル スコープ内の変数にアクセスする 2 番目の方法は、特別な PHP カスタム $GLOBALS 配列を使用することです。前の例は次のように記述できます:
例 12-2. global の代わりに $GLOBALS を使用します


コードをコピーします

コードは次のとおりです:
Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示http:/ /www.CodeHighlighter.com/ -->$a = 1;$b = 2;function Sum()
{
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b" ];
}
Sum();
echo $b;
?>


$GLOBALS 配列では、各変数は要素であり、キー名は変数名に対応し、値変数の内容。 $GLOBALS はスーパーグローバル変数であるため、$GLOBALS はグローバル スコープ内に存在します。次の例は、スーパーグローバル変数の使用を示しています:
例 12-3. スーパーグローバル変数とスコープを示す例


コードをコピーします

コードは次のとおりです:

Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示http://www.CodeHighlighter.com/-->function test_global()
{
// 事前定義された変数のほとんどは "super" ではなく、必要な変数です。 'global' キーワードを使用すると、関数のローカル スコープで使用できるようになります。
global $HTTP_POST_VARS;
print $HTTP_POST_VARS['name'];
// スーパーグローバルはどのスコープでも有効であり、「グローバル」宣言は必要ありません。スーパーグローバルは PHP 4.1.0 で導入されました。
Print $_POST['name'];
}
?>

静的変数の使用
変数スコープのもう 1 つの重要な機能は、静的変数です。静的変数はローカル関数スコープ内にのみ存在しますが、プログラムの実行がこのスコープを離れても、その値は失われません。次の例を見てください:
例 12-4. 静的変数を必要とする例を示します
コードをコピーします コードは次のとおりです:

Actipro CodeHighlighter (フリーウェア)http: //www.CodeHighlighter.com /-->function Test ()
{
$a = 0;
echo $a;
$a++;
}
?>

この関数は呼び出されるたびに $a の値が 0 に設定され、「0」が出力されるため、ほとんど役に立ちません。関数が終了すると変数 $a は存在しないため、変数を 1 つインクリメントする $a++ は効果がありません。このカウント値を失わないカウント関数を作成するには、変数 $a を静的として定義します:
例 12-5. 静的変数の使用例
コードをコピーします コードは次のとおりです:

Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示http://www.CodeHighlighter.com/-->function Test()
{
static $a = 0;
echo $a;
$a++;
}
?>

これで、Test() 関数が呼び出されるたびに、$a の値が出力され、1 ずつ増加します。
静的変数は、再帰関数を処理する方法も提供します。再帰関数は、それ自体を呼び出す関数です。再帰関数を作成するときは、無限に再帰する可能性があるので注意してください。再帰を終了する適切な方法があることを確認する必要があります。静的変数 $count を使用して再帰的に 10 までカウントするこの単純な関数を考えてみましょう:
例 12-6. 静的変数と再帰関数
コードをコピーします コードは次のとおりです:

Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示http://www.CodeHighlighter.com/-->function Test()
{
static $count = 0;
$count++;
echo $count ;
if ($ count < 10) {
Test ();
}
$count--;
}
?>

注: 静的変数は、上記の例のように宣言できます。これを宣言内の式の結果に代入すると、解析エラーが発生します。
例 12-7. 静的変数の宣言
コードをコピー コードは次のとおりです:

Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示http://www.CodeHighlighter.com/-->< ;?php
function foo(){
static $int = 0; // 正しい
static $int = 1+2; // 間違っています
static $int = sqrt(121);間違っています (式でもあるため)
$int++;
echo $int;
}
?>

グローバル変数と静的変数への参照
PHP4 を駆動した第一世代の Zend エンジンでは、静的変数と静的変数変数のグローバル定義は参照を使用して実装されました。たとえば、関数スコープ内の global ステートメントを使用してインポートされた真のグローバル変数は、実際にグローバル変数への参照を確立します。これにより、次の例に示すように、予期しない動作が発生する可能性があります。
コードをコピーします。 コードは次のとおりです。

Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示 http://www.CodeHighlighter.com / -->function test_global_ref() {
global $obj;
$obj = &new stdclass;
}
function test_global_noref() {
global $obj;
$obj = new stdclass;
}
test_global_ref ();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>

上記の例を実行すると、次の出力が得られます:
コードをコピーしますコードは次のとおりです:

NULLobject(stdClass)(0) {}

同様の動作は静的ステートメントにも適用されます。参照は静的に保存されません:
コードをコピーします コードは次のとおりです:

Actipro CodeHighlighter (フリーウェア) によって生成されたコードの強調表示 http://www.CodeHighlighter.com/--> function &get_instance_ref() {
static $obj;
echo "Static object: ";
var_dump($obj);
if (!isset($obj)) {
// 静的変数への参照を代入します
$ obj = &new stdclass;
}
$obj->property++;
return $obj;
}
function &get_instance_noref() {
static $obj;
echo "静的オブジェクト: ";
var_dump($obj);
if (! isset($obj)) {
// オブジェクトを静的変数に代入します
$obj = new stdclass;
}
$obj->property++;
return $obj;
}
$obj1 = get_instance_ref() ;
$still_obj1 = get_instance_ref();
echo "n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>

上記の例を実行すると、次の出力が得られます。
コードをコピーします コードは次のとおりです:
Static オブジェクト: NULLStatic オブジェクト: NULLStatic オブジェクト: NULLStatic オブジェクト: object(stdClass)(1) { ["property"]=> int(1)}

上記の例は、参照が静的変数に割り当てられている場合、&get_instance_ref() 関数が 2 回目に呼び出されたときにその値が記憶されない場合を示しています。

http://www.bkjia.com/PHPjc/327377.htmlwww.bkjia.com本当http://www.bkjia.com/PHPjc/327377.html技術記事 PHP のすべての変数には、その変数に固有のスコープがあります。これは、変数 (およびその値) にアクセスできる領域です。まず、変数のスコープは...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート