ホームページ  >  記事  >  バックエンド開発  >  PHPの静的変数について詳しく解説

PHPの静的変数について詳しく解説

小云云
小云云オリジナル
2018-03-16 13:52:361828ブラウズ

静的変数の型指定子は静的です。静的変数は静的ストレージ方式に属し、そのストレージスペースはメモリ内の静的データ領域です (ストレージユニットは静的ストレージ領域に割り当てられます)。この領域のデータは、実行期間全体を通じて常にこれらのストレージスペースを占有します。プログラムが終了するまで(プログラムの実行期間全体が解放されない)、そのメモリアドレスはプログラム全体が終了するまで変更されないままであると考えることもできます(逆に、 auto 自動変数、つまり動的ローカル変数は動的ストレージ カテゴリに属し、動的ストレージ領域を占有し、関数呼び出しが完了すると解放されます)。静的変数はプログラムの実行中に常に存在しますが、その範囲外では使用できません。

また、静的保存メソッドに属する変数は必ずしも静的変数であるとは限りません。 例: 外部変数 (PHP ではグローバル変数と呼ばれます) は静的ストレージ メソッドですが、静的外部変数または静的グローバル変数になる前に、必ずしも静的変数である必要はありません。

すべてのグローバル変数は静的変数であり、ローカル変数は、型修飾子 static を使用して定義されている場合にのみローカル静的変数です。

静的変数はどこにでも適用できます。アプリケーションが成功すると、他の同じアプリケーションは受け入れられなくなります。

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

1. 静的ローカル変数:

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

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

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

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

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

2. 静的グローバル変数

グローバル変数 (外部変数) の宣言の前に static を付けて、静的グローバル変数を形成します。

グローバル変数自体は静的格納メソッドであり、静的グローバル変数も当然静的格納メソッドです。

保管方法に関しては、両者に違いはありません。

2 つの違いは次のとおりです:

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

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

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

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

3. PHP に適用

<?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
?>

関連する推奨事項:

php: 静的変数と通常の変数の違いの分析

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

PHPの静的変数

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

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