PHP対象プログラム設計(oop)に向かってメモ(二)-静的変数の属性と方法及び遅延バインディングを学習する。

3529 ワード

Static(静的)キーワードは静的方法と属性を定義するために用いられ、Stticは静的変数と後期静的バインディングを定義するためにも使用され得る。
1、静的変数static variable
静的変数は局所関数領域にのみ存在しますが、プログラム実行がこのスコープから離れると、その値は失われません。つまり、変数は次の関数を実行する時も元の値を覚えています。ある変数を静的に定義するには、変数の前にstaticキーを加えればいいです。

function testing()
{
    static $a = 1;
    $a *= 2;
    echo $a."
";
}
testing();
testing();
testing();
testing();
/**
 *    2
 *    4
 *    8
 *    16
 *    [Finished in 0.1s]
*/
静的変数はまた、再帰関数を扱う方法を提供する。再帰関数は自分を呼び出す関数です。再帰関数を書くときは、無限再帰する可能性があるので注意してください。再帰を中止する十分な方法があることを確認しなければならない。
この例ではtesting()関数は、毎回実行されるごとに、$a変数の値を内部に保存します。次のtesting()関数が呼び出されると$aの値が戻ります。testing()関数はこの値を2倍にして印刷します。変数の初期デフォルト値は1です。この割り当ては変数が最初に初期化された時にのみ発生します。関数が実行されるたびに、この操作は呼び出されません。
2、クラスにおける静的要素の使用
クラスでstaticキーワードには2つの主要な使用法があり、1つは静的なメンバを定義するためのもので、もう1つは静的な方法を定義するためのものである。宣言クラスの属性または方法は静的であり、クラスを実装せずに直接アクセスすることができます。静的属性は、クラスのインスタンス化されたオブジェクトを介してアクセスできません。しかし、静的方法は可能です。静的属性は、オブジェクトが->オペレータを介してアクセスできません。クラスの内部では、スコープ限定オペレータを使用して、異なるレベルのスコープの変数にアクセスすることができます。
2.1、静的属性
静的方法はオブジェクトを介して呼び出す必要がないので、擬似変数は静的方法では利用できません。静的変数は、クラス全体に属するのではなく、クラス全体に属するあるインスタンスと見なすことができる。一般的なインスタンス変数とは異なり、静的属性は一つの変数値だけを保持し、この変数値はすべてのインスタンスに有効であり、つまりすべてのインスタンスにこの属性を共有する。

class MyObject
{
    public static $a = 0;
    function MyMethod()
    {
        self::$a += 2;
        echo self::$a . "
";
    }
}
$instance1 = new MyObject();
$instance1 -> MyMethod();
$instance2 = new MyObject();
$instance2 -> MyMethod();
/**
 *
 * 2
 * 4
 * [Finished in 0.1s]
 *
 */
$thisの指標は、現在のクラスの例であり、呼び出し元のオブジェクトへの参照です。
self:クラス自体を表しています。self:スコープを使う時はオペレータの後ろにドル記号を付けなければなりません。クラス以外のコードではこのオペレータは使えません。そして、ツリーの階層構造を受け継ぐ中の自分の位置は識別できません。拡張クラスでself:スコープを使用すると、selfはベースクラスで宣言された方法を呼び出すことができますが、呼び出しは常に拡張クラスで書き換えられています。
parent:拡張クラスでは、ベースの方法が書き換えられた場合、ベースの方法にアクセスするなら、parent:
static:self:とparent:はもういらないようにします。最終的な実現機能の種類を指すことを望むなら、staticを使うことができます。この限定子はコード実行前にすぐに継承層構造上の最後のクラスのメンバーを計算します。
2.3、静的方法
静的方法の規則と静的変数は同じである。staticキーワードを使用して方法を静的方法としてマークすることができ、クラス名と作用領域によってオペレータを定義することができます。
静的方法と非静的方法の間には重要な違いがあります。静的方法の呼び出しには、クラスのインスタンスが必要ではありません。

class MyObjectBase
{
    static function MyMethod()
    {
        static::MyOtherMethod();
    }
    static function MyOtherMethod()
    {
        echo 'called from MyObject.';
    }
}
class MyExtendObject extends MyObjectBase
{
    static function MyOtherMethod()
    {
        echo 'called from MyExtendObject.';
    }
}
MyExtendObject::MyMethod();
上記のコードは、MyExtendObjectのMyOtherMethodメソッドを正しく呼び出し、caled from MyExtendObject.[Finished in 0.1 s]を出力します。
ある方法には$this変数が含まれていない場合、この方法は静的方法であるべきです。クラスのインスタンスが必要でない場合は、静的なクラスも使用されるべきであり、このように、実用化された動作を省略することができる。また、静的方法では、特定の例に属さないので、$this変数は使用できない。
2.4、遅延バインディング
static:self:とparent:はもういらないようにします。最終的な実現機能の種類を指すことを望むなら、staticを使うことができます。この限定子はコード実行前にすぐに継承層構造上の最後のクラスのメンバーを計算します。このプロセスは遅延結合と呼ばれる。
3、まとめ
staticキーを使用して静的変数を作成することができ、標準の初期化値を提供することもできます。静的変数は修正された関数変数で、ある関数の実行が完了した後も彼の値は失われません。
staticキーワードはまた、クラスで属性や方法を修飾するために使用されます。属性上で使用すると、属性はインスタンスの値ではなく、クラス全体の値を保存します。静的属性はメンバー間で共有できます。
静的方法にアクセスするには、(:)を使用してもいいです。このオペレータの左側はクラス名または予め定義されたスコープであり、予め定義されたスコープはself parent staticを含む。オペレータの右側は静的な方法、属性です。