ホームページ  >  記事  >  バックエンド開発  >  PHP 変数のスコープに関するいくつかの問題の簡単な分析_PHP チュートリアル

PHP 変数のスコープに関するいくつかの問題の簡単な分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 14:59:46684ブラウズ

昨夜そのような問題に遭遇しました。それは関数内のグローバル変数の問題でした。今日検索を行ったところ、PHP の変数スコープに関する非常に良い記事を見つけました。これはネチズンによって翻訳され、ここに投稿されました:

変数のスコープ
変数のスコープとは、変数が定義されているコンテキストのことです (翻訳者: 単刀直入に言うと、変数の有効スコープです)。ほとんどの PHP 変数にはスコープが 1 つだけあります。この単一スコープ スパンには、include および require によって導入されたファイルも含まれます。例:

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

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


コードをコピー
コードは次のとおりです:$a = 1; /* グローバルスコープ */

function Test()
{

echo $a /* ローカルスコープ変数への参照 */

}
;
Test();
?>


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


グローバルキーワード

まず、グローバルの使用例です:
例 12-1. global の使用


コードをコピーします
コードは次のとおりです:$ a = 1;
$b = 2;

関数 Sum()
{

グローバル $a, $b;


$b = $a + $b;
}

Sum();
echo $b;

?>



上記のスクリプトの出力は「3」になります。グローバル変数 $a と $b は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。 PHP では、関数が宣言できるグローバル変数の最大数に制限はありません。

グローバル スコープ内の変数にアクセスする 2 番目の方法は、特別な PHP カスタム $GLOBALS 配列を使用することです。前の例は次のように記述できます:

例 12-2. global の代わりに $GLOBALS を使用します


コードをコピーします

コードは次のとおりです:$a = 1;
$b = 2;

関数 Sum()
{

$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];

}

Sum();
echo $b;

?>



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


例 12-3. スーパーグローバル変数とスコープを示す例


コードをコピーします

コードは次のとおりです:function test_global()
{
//事前定義された変数は「スーパー」ではなく、関数のローカル スコープで使用できるようにするには「global」キーワードが必要です。
グローバル $HTTP_POST_VARS;

print $HTTP_POST_VARS['name'];

// スーパーグローバルはどのスコープでも有効であり、「グローバル」宣言は必要ありません。スーパーグローバルは PHP 4.1.0 で導入されました。

Print $_POST['name'];

}

?>



静的変数の使用


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


コードをコピーします

コードは次のとおりです:function Test ()
{
$a = 0;
$a;
$a++;
}
?>
この関数は $a の値を 0 に設定し、呼び出されるたびに "0" を出力するため、あまり役に立ちません。関数が終了すると変数 $a は存在しないため、変数を 1 つインクリメントする $a++ は効果がありません。このカウント値を失わないカウント関数を作成するには、変数 $a を静的として定義します:

例 12-5. 静的変数の使用例

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

function Test()
{
static $a = 0;
echo $a;
$a++;
}
?>

これで、Test() 関数が呼び出されるたびに、$a の値が出力され、1 ずつ増加します。

静的変数は、再帰関数を処理する方法も提供します。再帰関数は、それ自体を呼び出す関数です。再帰関数を作成するときは、無限に再帰する可能性があるので注意してください。再帰を終了する適切な方法があることを確認する必要があります。静的変数 $count を使用して、いつ停止するかを決定し、再帰的に 10 までカウントするこの単純な関数を考えてみましょう:

例 12-6. 静的変数と再帰関数

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

function Test()
{
static $count = 0;

$count++;
echo $count;
if ($count < 10) {
Test ();
}
$count--;
}
?>


注: 静的変数は次のように使用できます。上記のステートメントの例。これを宣言内の式の結果に代入すると、解析エラーが発生します。

例 12-7. 静的変数を宣言する

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

function foo(){
static $int = 0; $int = 1+2; // (式なので) 間違っています
static $int = sqrt(121) // (これも式なので)
;

$int++;

echo $int;
}
?>


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

コードをコピー コードは次のとおりです:
function test_global_ref() {
global $obj;
$obj = &新しい標準クラス;
}

関数 test_global_noref() {

グローバル $obj;
$obj = 新しい stdclass;
}

test_global_ref();

var_dump($obj);
test_global_noref();
var_dump($obj);
?>

上記の例を実行すると、次の出力が得られます:

NULLobject(stdClass)(0) ) {}
同様の動作は静的ステートメントにも適用されます。参照は静的に保存されません:

コードをコピー コードは次のとおりです:
function &get_instance_ref() {
static $obj;

echo "静的オブジェクト: ";

var_dump($obj);
if (!isset($obj)) {
// 静的変数への参照を代入します
$obj = &new stdclass;
}
$obj-> ;property++;
$obj;
}
を返す

関数 &get_instance_noref() {

static $obj;

echo "静的オブジェクト: ";

var_dump($obj);
if (!isset($obj)) {
// オブジェクトを静的変数に代入します
$obj = new stdclass;
}
$obj-> ;property++;
$obj;
}
を返す

$obj1 = get_instance_ref();

$still_obj1 = get_instance_ref();
echo "/n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>
上記の例を実行すると、次の出力が得られます:
Static object: NULLStatic object: NULLStatic object: NULLStatic object: object(stdClass)(1) { ["property"]=> int(1)}
;
上 この例は、参照が静的変数に割り当てられた場合、&get_instance_ref() 関数が 2 回目に呼び出されたときにその値が記憶されないことを示しています。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/328128.html技術記事昨夜そのような問題に遭遇しました。それは関数内のグローバル変数に関する問題でした。今日検索を行ったところ、PHP の変数スコープに関する非常に良い記事を見つけました。ネチズンです...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。