ホームページ  >  記事  >  バックエンド開発  >  静的静的ローカル変数と静的グローバル変数の違いを詳しく解説

静的静的ローカル変数と静的グローバル変数の違いを詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-05-08 10:56:3915145ブラウズ

ローカル変数は、保存方法の観点から動的保存タイプと静的保存タイプに分類できます。関数内のローカル変数は、特に静的ストレージ クラスとして宣言されていない限り、デフォルトで記憶領域を動的に割り当てます。内部動的変数は関数呼び出し後に自動的に解放されます。関数の実行後に内部変数をメモリ内に残しておきたい場合は、静的変数を使用する必要があります。関数の実行後、静的変数は消えることはありませんが、関数へのすべての呼び出し間で共有されます。つまり、関数が再度実行されると、静的変数は前の結果から動作し続けます。 period 関数は、スクリプトの実行中に使用され、最初に呼び出されたときに初期化されます。関数変数を静的として宣言するには、キーワード static を使用する必要があります。

前に、php 変数のスコープ内のローカル変数と、php 変数のスコープ内のグローバル変数を紹介しました。静的変数はどこにでも適用できます。アプリケーションが成功すると、他の同様のアプリケーションは受け入れられなくなります。

静的変数は、値を変更できないという意味ではありません。値を変更できない量は定数と呼ばれます。 保持する値は変更可能であり、最新の状態を保ちます。関数が呼び出されたとき、または関数が終了したときに変化しないため、静的であると言われます。つまり、最後に関数を呼び出したときに静的変数に特定の値を割り当てた場合、その値は次回関数が呼び出されたときも変更されません。

1. 静的ローカル変数:

1. 静的型の内部変数は、自動自動変数 (つまり、静的宣言のないローカル変数) と同じです。これらは、変数がその変数の関数内で使用される場合にのみ定義できます。この 2 つの違いは、auto 自動変数が関数の呼び出しと終了に応じて存在し、消滅することです。一方、静的クラスのローカル変数は存在せず、呼び出されるかどうかに関係なく存在しますが、使用することはできません。それを定義する関数が再度呼び出された場合、その関数は引き続き使用でき、前回の呼び出し後に残った値は保存されます。つまり、静的型の内部変数は、特定の関数内でのみ使用できるが、常に記憶領域を占有する変数です。

2. 関数本体で静的変数を定義しているときに初期化が実行された場合、プログラムは今後初期化操作を実行しません (関数内に出現する基本型の静的変数初期化ステートメントは最初の呼び出しでのみ実行されます)。自動変数への初期値の代入は、関数が呼び出されるたびに実行され、代入ステートメントを実行するのと同じになります。

3. 静的ローカル変数の初期化式は、定数または定数式である必要があります。ローカル静的変数が初期値なしで定義されている場合でも、システムは自動的に初期値 0 (数値変数の場合) または null 文字 (文字変数の場合) を割り当てます。静的変数の初期値は 0 です。自動変数 auto は、初期値が代入されていない場合、その値は不定な値となります。

4. 関数が複数回呼び出され、呼び出し間で特定の変数の値を保持する必要がある場合は、静的ローカル変数を検討できます。上記の目的を達成するためにグローバル変数を使用することもできますが、グローバル変数は予期しない副作用 (主に変数のスコープによって引き起こされる) を引き起こす場合があるため、ローカル静的変数を使用することをお勧めします。

注: ローカル静的変数はメモリ内で長時間を消費し、可読性が低いため、必要な場合を除き、ローカル静的変数の使用は避けてください。

2. 静的グローバル変数

グローバル変数 (外部変数) の宣言の前に static を付けて、静的グローバル変数を形成します。 グローバル変数自体は静的ストレージメソッドであり、静的グローバル変数も当然静的ストレージメソッドです。 保管方法に関しては、両者に違いはありません。

静的静的ローカル変数と静的グローバル変数の違い

両者の違いは次のとおりです:

1. 非静的グローバル変数の範囲は、ソースプログラムが構成されるときのソースプログラム全体です。複数のソースの ファイルが構成されるとき、非静的グローバル変数は各ソース ファイルで有効です。

2. 静的グローバル変数はスコープを制限します。つまり、変数が定義されているソース ファイル内でのみ有効であり、同じソース プログラムの他のソース ファイルでは使用できません。

上記の分析からわかるように——

ローカル変数を静的変数に変更すると、その格納方法が変更され、つまり、その有効期間が変更されます。

グローバル変数を静的変数に変更すると、そのスコープが変更され、使用範囲が制限されます。 static 静的変数は、スタックに割り当てられるのではなく、プログラムのグローバル ストレージ領域 (つまり、プログラムのグローバル データ領域) に配置されるため、スタック オーバーフローは発生しません。これにより、次回呼び出されたときに元の割り当てが維持されます。これが、スタック変数ヒープ変数との違いです。

サンプルコードは次のとおりです:

<?php
//--------------如何理解static静态变量-----------
 
/** 普通局部变量 */
function local() {
    $loc = 0; //这样,如果直接不给初值0是错误的。
    ++$loc;
    echo $loc . &#39;<br>&#39;;
}
local(); //1
local(); //1
local(); //1
echo &#39;===================================<br/>&#39;;
 
/** static静态局部变量 */
function static_local() {
    static $local = 0 ; //此处可以不赋0值
    $local++;
    echo $local . &#39;<br>&#39;;
}
static_local(); //1
static_local(); //2
static_local(); //3
//echo $local; 注意虽然静态变量,但是它仍然是局部的,在外不能直接访问的。
echo &#39;=======================================<br>&#39;;
 
/** static静态全局变量(实际上:全局变量本身就是静态存储方式,所有的全局变量都是静态变量) */
function static_global() {
    global $glo; //此处,可以不赋值0,当然赋值0,后每次调用时其值都为0,每次调用函数得到的值都会是1,但是不能想当然的写上"static"加以修饰,那样是错误的.
    $glo++;
    echo $glo . &#39;<br>&#39;;
}
static_global(); //1
static_global(); //2
static_global(); //3
?>

以上が静的ローカル変数と静的グローバル変数の詳しい説明です。

【おすすめ関連チュートリアル】

1.「php.cn Dugu Jiijian (4) - PHPビデオチュートリアル

2. PHPプログラミングの入門からマスターまでの完全なビデオチュートリアル

3. . php実践的なビデオチュートリアル

以上が静的静的ローカル変数と静的グローバル変数の違いを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。