1. 静的変数
1. 静的変数はスコープ内にのみ存在する変数ですが、関数の実行が完了した後、この変数の値は失われません。の場合、変数は「元の値を記憶」のままになります。
2. 式の計算結果を静的変数に代入することは不正です。式は、値が変化する任意のステートメントを指します。たとえば、(1+1)、$variable、および anyfunc() はすべて式です。
3. グローバル変数を使用すると同じ結果が簡単に得られるため、静的変数の定義はあまり役に立たないと思われるかもしれません。ただし、グローバル変数はすべての関数からアクセスできるため、独立しているはずの複数の関数が同じ名前の変数を使用すると競合が発生します。また、グローバル変数を導入する場合と比較して、静的変数を使用する場合はより多くのロットを必要としません。構文の。したがって、1 つの関数だけが特定の変数にアクセスする必要がある場合は、グローバル変数の代わりに静的変数を使用することを選択する必要があります。
2. クラスでの静的要素の使用
4. クラスでは、static キーワードには主に 2 つの用途があります。1 つは静的メンバーの定義に使用され、もう 1 つは静的メソッドの定義に使用されます。
5. 静的メンバーはクラス変数であり、クラスのインスタンスではなくクラス全体に属するとみなすことができます。一般的なインスタンス変数とは異なり、静的メンバーは 1 つの変数値のみを保持し、この変数値はすべてのインスタンスに対して有効です。つまり、すべてのインスタンスがこのメンバーを共有します。
6.$this は現在のクラスのインスタンスのみを表し、self:: はクラス自体を表します (後に $ を追加します)
7. スコープ制限演算子::
スコープ制限演算子を通じて、2 つのシステム定義関数を使用できます。 :自分と親。さらに、php5.3 では静的スコープも提供されます。 self は現在のクラスのスコープを表しますが、$this とは異なり、クラスの特定のインスタンスを表しません。この演算子はクラス外のコードでは使用できず、継承ツリー階層内の位置を認識しません。つまり、拡張クラスで self スコープを使用する場合、self は基本クラスで宣言されたメソッドを呼び出すことができますが、常に拡張クラスでオーバーライドされたメソッドを呼び出します。 (Java のメソッド カバレッジに相当し、parent を使用して親クラスのメソッドを明示的に呼び出す)
親クラスの静的変数を書き換えて、サブクラスで同じ静的変数を定義する
Php コード
class aaa { function bbb(){ echo 'クラスメソッドを呼び出すには二重コロン:: を使用してください!'; } } // 呼び出し 1: $a = new aaa(); $a->bbb(); // 呼び出し 2: aaa::bbb( ); ?> ;
なぜ通常のメソッド bbb をクラス名で直接呼び出すことができるのかわかりません:: java
Test.java
class Test{
とは違うようです。
//共通メソッド
public void Eat() {
System.out.println("no-static!");
}
//静的メソッド
public static void show(){
System.out.println("static!") ;
}
//メインメソッド
public static void main(String args[]){
テスト obj=new Test();
obj.eat( ); //出力 no- static! obj.show();//メソッドはクラスに属しており、もちろんクラスのインスタンスにアクセスできますが、Eclipse などのエディターには黄色のプロンプトは、クラス名を使用して直接呼び出すことを提案しますタイプから Test は静的な方法でアクセスする必要があります) Test.show();//output static ) php は耐えられます。 。 。 } }個人的な理解: $this->xx が呼び出される通常のメソッドに現れない限り ($this は現在のクラスのインスタンスのみを表します)、通常のメソッドもそのクラスに直接属していると見なすことができます。これはクラス名を使用して直接呼び出すことができますが、クラス名を使用して直接呼び出す前に静的として宣言する必要がある Java のメソッドとは異なります (php6 では、静的メソッドの操作にいくつかの変更が加えられています。まず、非静的メソッドでは、 :: 演算子は使用されなくなりました。このメソッドには Got kill が必要です。
php5.3 で提案された static:: スコープは必要ありません。 self:: とparent:: を使用する必要があります。最終実装クラスを指定する場合は、 static:: を使用できます。この修飾子は、コードが実行される直前に、継承階層の最後のクラスのメンバーを計算します。このプロセスは遅延バインディングと呼ばれます。用途がわからないようですが、最終実装クラスの新しいオブジェクトを親クラスに直接作成して呼び出すことはできませんか?ただし、最終クラスが何と呼ばれるか、オーバーライドされたメソッドがどのような効果をもたらすかがわからない場合には、これが役立つと思われます。 static::scope は静的メソッドにも適用できるため、サブクラスのメソッドを親クラスから静的に呼び出すことができます。