PHP の静的変数は関数スコープ内にのみ存在します。つまり、静的変数はスタック上にのみ存在します。PHP では、キーワード static が変数の前に追加されている限り、変数は静的になります。変数。 。
この記事の動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター
静的変数とは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
関数テスト( ) が実行されると、変数 $nm の値が保存されます。
静的プロパティは、静的メンバーや静的メソッドなどのクラスでよく使用されます。
プログラム リスト: クラスの静的メンバー
静的変数 $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() ?>
プログラムの実行結果:
これはデモンストレーションの結果です()
以下は、PHP 静的変数の使用方法の概要です静的キーワードは C# プログラミングで非常に一般的で、特定のオブジェクトではなく型自体に属する静的メンバーの宣言を変更するために使用されます。 static 修飾子は、クラス、フィールド、メソッド、プロパティ、演算子、イベント、およびコンストラクターで使用できますが、インデクサー、デストラクター、またはクラス以外の型では使用できません。 static として宣言されたクラス、関数、変数は、インスタンス メソッドや変数を参照できません。また、C# では、static 修飾子がクラスに追加されると、その中のすべての変数とメソッドは static でなければなりません。静的変数と静的メソッドは、インスタンス オブジェクトではなく、クラス名を通じて参照する必要があります。
それでは、PHP と C# の static キーワードの違いは何でしょうか?
宣言範囲
C# と比較して、PHP での静的変数の使用範囲は広く、クラス、メソッド、または変数の前に static 修飾子を追加できるだけでなく、関数の内部変数に static キーワードを追加することもできます。 static 修飾子を追加した変数の値は、関数が実行された後でも失われません。つまり、変数は次回関数が呼び出されたときにも元の値を記憶しています。例:
<?php function test() { static $var=; $var+=; echo $var.' '; } test(); test(); test(); ?>
実行結果は次のとおりです:
3 5 7
ここで注意すべき点は、変数の代入操作は、変数内で初めて発生します。これは初期化中に呼び出されます。この操作は、後続の関数の実行中には呼び出されません。
PHP の関数も第一級市民であるため、C# とは異なり、関数を直接定義し、コード内の任意の場所で直接呼び出すことができます。これは JavaScript に似ています。したがって、現時点では、グローバル変数を定義するよりも関数静的変数の方が便利であり、変数の繰り返し定義によって引き起こされる競合を回避できます。 C# の関数は直接定義して呼び出すことができないため、クラスでホストする必要があります。したがって、関数に静的変数が必要な場合、クラス内で定義するだけで同じ効果が得られます。
メソッドの呼び出しC# では、静的メンバーを呼び出す方法は非常にシンプルで一貫しています。静的メンバーはインスタンス オブジェクトに属さないため、静的メンバーがメソッドであるかどうかは関係ありません。または変数、C# の静的メンバーへのアクセスは常にクラス名.メソッド (変数) を通じて行われます。また、C# では、静的関数を仮想メソッドとして設定したり、オーバーライドしたりすることはできません。 PHP はこれに対して、より柔軟で多様なサポートを提供します。
まず第一に、PHP でのインスタンス メソッドの呼び出しは someobj->someFun() を通じて呼び出されることはわかっていますが、C# のように SomeClass->someFun() を通じて静的関数を呼び出すことはできますか?答えは「いいえ」です。PHP では、静的メンバーは SomeClass::someFun() など、:: を通じてのみ呼び出すことができます。
<?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 1 5
C# と異なるもう 1 つの点は、クラス内のメソッドにあることです。静的変数を呼び出す必要がある 静的変数 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提供了比C#更为强大的功能或灵活性,但从我的角度来看,这种灵活性不见得就更好,从某种角度来看,如果类的继承层次过于复杂,它可能会让我产生混淆。当然,同样的工具不同人使用效果会完全不一样,既然PHP提供了更多样的选择,那么相信如果使用恰当的话,PHP中的static可能会提供比C#中更为强大而简便的使用方式。
推荐学习:《PHP视频教程》
以上がPHPメソッドの静的変数とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。