2013年8月8日木曜日

「static::」キーワードの使い方

在庫管理システムをPHPで作っています。

静的プロパティや静的メソッドを参照するための、
「parent::」や「self::」は理解しやすいと思います。
一方「static::」はマニュアルを読んでもとてもややこしいものです。
しかし、どうやら使いどころは簡単です。

結論としては、子クラスから呼ばれた親クラスが、子クラスの静的プロパティや静的メソッドを参照したい時に使うようです。

親クラスを直接インスタンス化すれば「static::」は「self::」と同義になります。
親クラスが抽象クラスなら、「static::」は必ず子クラスの静的プロパティや静的メソッドを呼ぶことになります。

class Tomjr extends Tom {
    protected static $sentence="私はTomjr";
    public function foo(){
        $this->bar();
    }
}

class Tom {
    protected static $sentence="私はTom";
    public function bar(){
        echo static::$sentence;//親クラスが子クラスの静的プロパティ・メンバを呼ぶときに使う
    }
}

$tomjr = new Tomjr();
$tomjr->foo();//結果:私はTomjr
$tom = new Tom();
$tom->bar();//結果:私はTom

なお、子クラスが該当の静的プロパティ・メンバを持っていなかっ場合は、親クラスのそれが呼ばれます。

本質的に理解するには以下をご参考下さい。
図を使った簡潔でわかりやすい説明がありました:

PHPを愛する試み ~self:: parent:: static:: および遅延静的束縛~

0 件のコメント:

コメントを投稿