ホームページ >バックエンド開発 >PHPチュートリアル >PHPの静的変数の機能は何ですか
この記事では主に PHP における静的変数の役割について紹介します。興味のある方はぜひ参考にしてください。
おすすめマニュアル: php完全自習マニュアル
静的変数は関数スコープ内にのみ存在します。つまり、静的変数はスタック上にのみ存在します。
一般に、ローカル変数など関数内の変数は関数終了後に解放されますが、静的変数は解放されません。
つまり、変数の値は次回この関数が呼び出されたときに保持されます。
変数の前にキーワード static を追加する限り、変数は静的変数になります。
<?php function test() { static $nm = ; $nm = $nm * ; print $nm."<br />"; } // 第一次执行,$nm = test(); // 第一次执行,$nm = test(); // 第一次执行,$nm = test(); ?>
プログラムの実行結果:
1 2 2 4 3 8
関数test()の実行後、変数$nmの値が保存されます。
静的プロパティは、静的メンバーや静的メソッドなどのクラスでよく使用されます。
おすすめ関連記事:
1.phpの静的変数はいつ破棄されますか
2.PHP の静的変数とグローバル変数の違いは何ですか?
関連ビデオの推奨:
1.Dugu Jiijian (4)_PHP ビデオ チュートリアル
プログラム リスト: クラスの静的メンバー
静的変数 $nm はクラス nowamagic に属しており、どの部分にも属していませんクラスインスタンスの。この変数はすべてのインスタンスに対して有効です。
:: はスコープ制限演算子です。$this スコープの代わりに self スコープが使用されます。$this スコープはクラスの現在のインスタンスのみを表し、self:: はクラス自体を表します。
<?php class nowamagic { public static $nm = ; function nmMethod() { self::$nm += ; echo self::$nm . '<br />'; } } $nmInstance = new nowamagic(); $nmInstance -> nmMethod(); $nmInstance = new nowamagic(); $nmInstance -> nmMethod(); ?>
プログラム実行結果:
1 3 2 5
プログラムリスト:静的プロパティ
<?php class NowaMagic { public static $nm = 'www.nowamagic.net'; public function nmMethod() { return self::$nm; } } class Article extends NowaMagic { public function articleMethod() { return parent::$nm; } } // 通过作用于限定操作符访问静态变量 print NowaMagic::$nm . "<br />"; // 调用类的方法 $nowamagic = new NowaMagic(); print $nowamagic->nmMethod() . "<br />"; print Article::$nm . "<br />"; $nmArticle = new Article(); print $nmArticle->nmMethod() . "<br />"; ?>
プログラム実行結果:
www.nowamagic.net www.nowamagic.net www.nowamagic.net www.nowamagic.net
プログラムリスト:単純な静的コンストラクター
PHPには静的コンストラクターが必要な場合があります静的クラスの場合は、クラス定義の直後にクラスの Demonstration() メソッドを呼び出すという非常に簡単な方法があります。
<?php function Demonstration() { return 'This is the result of demonstration()'; } class MyStaticClass { //public static $MyStaticVar = Demonstration(); //!!! FAILS: syntax error public static $MyStaticVar = null; public static function MyStaticInit() { //this is the static constructor //because in a function, everything is allowed, including initializing using other functions self::$MyStaticVar = Demonstration(); } } MyStaticClass::MyStaticInit(); //Call the static constructor echo MyStaticClass::$MyStaticVar; //This is the result of demonstration() ?>
プログラムの実行結果:
This is the result of demonstration()
以下は、PHP 静的変数の使用方法の紹介です
static キーワードは、C# プログラミングでは非常に一般的であり、ステートメントを型自体に属するように変更するために使用されます。特定の静的メンバーに。 static 修飾子は、クラス、フィールド、メソッド、プロパティ、演算子、イベント、およびコンストラクターで使用できますが、インデクサー、デストラクター、またはクラス以外の型では使用できません。
さらに、静的として宣言されたクラス、関数、変数は、インスタンス メソッドや変数を参照できません。また、C# では、静的修飾子がクラスに追加されると、その内部のすべての変数とメソッドが静的になる必要があります。静的変数と静的メソッドは、インスタンス オブジェクトではなく、クラス名を通じて参照する必要があります。
それでは、php と C# の static キーワードの違いは何でしょうか?
宣言範囲
C# と比較して、PHP での静的変数の使用範囲は広く、クラス、メソッド、または変数の前に静的修飾子を追加できるだけでなく、静的キーを追加することもできます。関数の内部変数。 static 修飾子が追加された変数の値は、関数が実行された後でも失われません。つまり、変数は次回この関数が呼び出されたときにも元の値を記憶しています。例:
<?php function test() { static $var=; $var+=; echo $var.' '; } test(); test(); test(); ?>
実行結果は次のとおりです:
3 5 7
ここで注意すべき点は、変数の代入操作は変数が初めて初期化されるときにのみ呼び出されるということです。この操作は変数の初期化中には呼び出されません。その後の関数の実行。
PHP の関数も第一級市民であるため、C# とは異なり、関数を直接定義し、コード内の任意の場所で直接呼び出すことができます。これは JavaScript に似ています。したがって、現時点では、グローバル変数を定義するよりも関数静的変数の方が便利であり、変数の繰り返し定義によって引き起こされる競合を回避できます。
C# の関数は直接定義して呼び出すことができないため、クラスでホストする必要があります。そのため、関数に静的変数が必要な場合は、クラス内で定義するだけで同じ効果が得られます。
メソッドの呼び出し
C# では、静的メンバーを呼び出す方法は非常にシンプルで一貫しています。静的メンバーはインスタンス オブジェクトに属さないため、メソッドであっても変数であっても、C# がその静的メンバーにアクセスする方法は同じです。常にクラス名 .method (変数) を使用します。
そして、C# では、静的関数を仮想メソッドとして設定したり、オーバーライドしたりすることはできません。 PHP はこれに対して、より柔軟で多様なサポートを提供します。
まず第一に、PHP でのインスタンス メソッドの呼び出しは
someobj->someFun() を通じて呼び出されることはわかっていますが、C# のように SomeClass->someFun() を通じて静的関数を呼び出すことはできますか?
答えはノーです。PHP では、静的メンバーの呼び出しは SomeClass::someFun() などの :: を介してのみ実行できます。
rreee実行結果は以下の通りです:
3 1 5
另外一点和C#中不同的是,在类中的方法中,如果我们需要调用静态变量,必须通过self::$somVar静态变量(注意变量前面的$符号,实例变量不需要),而调用静态方法则为self::someFun()(这里不需要$符号)。如上例。
另外,与C#最大的不同之处就是,PHP中,子类是可以覆盖父类的静态函数或变量的,不仅如此,(站在C#程序员的角度来看,我觉得PHP这点反而将事情搞复杂了),由于默认self::staticFun()调用的是子类的静态函数,这个时候如果我们想调用父类的静态变量怎么办呢?
这里PHP提供了额外的parent来调用基类的静态成员。如:
<?php class TestC { public static $var=; public $var=; function t() { self::$var+=; echo self::$var.' '; echo $this->var.' '; } public static function t() { self::$var+=; echo self::$var.' '; } } $t=new TestC(); $t->t(); TestC::t(); ?>
运行结果如下:
3 5 ‘Hello'
最好,根据上面的例子我们很容易想到,子类访问父类可以使用parent关键字,那么父类如何访问子类的静态方法呢?这里给出static的另外一个用法,这里如果将调用的静态方法前面的作用域换成static的话,PHP会根据该类的继承层次来计算最终的静态方法。如:
<?php class Test { function t() { static::t(); } public static function t() { echo self::'Test '; } } class Test extends Test { static function t() { echo self::'Test '; } } $t=new Test(); $t->t(); Test::t(); ?>
运行结果如下:
Test2 Test2
这里t实例在t1方法调用t2静态方法时,会根据其实例找到最终的静态方法并输出Test2。
相关推荐:
以上がPHPの静的変数の機能は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。