PHP static キーワード は、静的メソッドと プロパティ を定義するために使用されます。これらは、クラス内で静的バインディングを遅らせたり、関数内の変数を変更したりするために使用できます。
1: まず、関数での static の使用について話しましょう
function add(){ static $a = 0; echo $a,"<br />"; $a++; }
ここでの static の役割は、C での static の役割と似ており、$a 変数が確実には、() が最初に呼び出されたときに初期化される場合にのみ追加されますが、静的変数を定義する場合、初期値を割り当てる必要はなく、初期値を与えることができますが、代入するときに注意してください。初期値の場合、式を使用したり、関数を呼び出したりすることはできません。それ以外の場合は、エラーが報告されます。
もう 1 つの注意点は、次のように、静的変数は参照を保存しないことです:
function get_obj_ref(){ static $obj = null; echo 'Ststic obj:',"<br />"; var_dump($obj); if(is_null($obj)){ $obj = &new stdClass(); } return $obj; } $obj = get_obj_ref(); $obj2 = get_obj_ref(); function get_obj_noref(){ static $obj = null; echo 'Ststic obj:',"<br />"; var_dump($obj); if(is_null($obj)){ $obj = new stdClass(); } return $obj; } $obj = get_obj_noref(); $obj2 = get_obj_noref();
静的に参照を保存する場合、関数を 2 回呼び出し、上記を実行した後、変数の値は保存されません。プログラムは Deprecated エラーを報告します。つまり、戻り参照値の割り当ての使用が放棄されました。
2: クラス内の静的バインディングの遅延。
遅延静的バインディングとは、呼び出されたクラスが静的継承のコンテキストで参照できるようにすることを意味します。遅延バインディングとは、static:: が現在のメソッドが定義されているクラスではなく、実際に実行されるクラスであることを意味します。注: (ただし、これに限定されない) 静的メソッド呼び出しに使用できます。
単純な静的遅延バインディングの使用に加えて、self::、parent::、static::、および forward_static_call() を使用する前方呼び出しもあります (この関数は呼び出しのみ可能です)メソッド内) 次のように呼び出し情報を転送します。
class A { public static function foo() { static::who(); } public static function who() { echo CLASS."\n"; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo CLASS."\n"; } } class C extends B { public static function who() { echo CLASS."\n"; } } C::test();
ここで得られる結果は A C C です。 明らかに、parent::foo() を呼び出すとき、ランタイム呼び出しクラスが引き続き使用されます。
もう 1 つ注意すべき点は次のとおりです: 明示的に宣言された静的クラスのみが従属クラスとサブクラスになります。
次の部分はこのブログ投稿を参照しています: クリックしてリンクを開きます: PHP 静的継承
<span style="font-size:18px;">class A { protected static $var1 = null; protected static $var2 = null; public static function test(){ if(!static::$var2){ static::$var2 = static::$var1; } echo get_called_class().' '.static::$var2.' '; } } class B extends A { protected static $var1 = 'b'; } class C extends A { protected static $var1 = 'c'; } B::test(); C::test(); </span>
ここで得られた結果は b b です。ここでは、クラス B が最初に test() メソッドを呼び出し、呼び出し後に $var2 変数に値が割り当てられていますが、クラス C は独自の $var2 変数を定義しておらず、$var2 変数の値はすでに存在しています。親クラスなので、直接使用できます。クラス B 内で $var2 変数が明示的に定義されている場合、結果は異なります。
以上がPHPにおけるstaticキーワードの使い方と注意点を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。