(剛接觸這個高大上的東西,還不是特別的瞭解,不過基本是搞明白一些了。)
從PHP 5.3.0開始,PHP增加了一個叫做後期靜態繫結的功能,用於在繼承範圍內引用靜態調用的類。 該功能從語言內部角度考慮被命名為“後期靜態繫結”。 “後期綁定”的意思是說,static::不再被解析為定義當前方法所在的類,而是在實際運行時計算的。 也可以稱之為”靜態繫結“,因為它可以用於(但不限於)靜態方法的調用。
科普幾個:1.什麼是靜態調用?並不是說有::就是靜態調用,而是看calling scope。2.$this指標指向的對象就是這個方法被調用時刻的calling scope,靜態調用是沒有calling scope的,非靜態調用this−>abc()中的this−>abc()中的this指向的對象就是calling scope。3.大家盡量要避免使用”::”來調用一個非靜態方法.4.this,self,parent三個關鍵字從字面上比較好理解,分別是指這、自己、父親。this是指向當前對象的指標,self是指向當前類的指標,parent是指向父類的指標。5.靜態環境即靜態域。public static function
引用參考:
http://www.laruence.com/2012/06/14/2628.html
http://www.cnblogs.com/yjf512/archive/2012/09/12/2682556.html
第一個例子
Example #1 self:: 用法< ?phpclass A { public static function who() {//這是一個靜態域 echo __CLASS__; } public static function test() { self::who(); //self關鍵字是調用自身的靜態域方法,調用的是上面那個 }}class B extends A { public static function who() { echo __CLASS__; }}B::test(); //這裡因為b繼承了a,理論上B::test()應該是出現B的輸出,但是因為使用 self:: ,self是調用自身 //所以輸出A?>以上常式會輸出:A
第二個例子
Example #2 static:: 簡單用法< ?phpclass A { public static function who() { echo __CLASS__; } public static function test() { //這是一個靜態範圍 static::who(); // 後期靜態繫結從這裡開始 // 雖然B繼承A,B在調用test方法的時候,靜態範圍會解析為了當前類B類,這就是“static::不再被解析為定義當前方法所在的類,而是在實際運行時計算的。” //所以會調用B類的who方法,所以輸出B }}class B extends A { public static function who() { echo __CLASS__; }}B::test(); ?>以上常式會輸出:B
在非靜態環境下,所調用的類即為該對象執行個體所屬的類。由於 $this-> 會在同一作用範圍內嘗試調用私人方法,而 static:: 則可能給出不同結果。另一個區別是 static:: 只能用於靜態屬性。
第三個例子
Example #3 非靜態環境下使用 static::< ?phpclass A { private function foo() { //這不是一個靜態域 echo "success!\n"; } public function test() { //這不是一個靜態域 $this->foo(); echo "---------\n"; var_dump($this); static::foo(); echo "+++++++++\n"; }}class B extends A { /* foo() will be copied to B, hence its scope will still be A and * the call be successful */ //scope依然是A,所以能夠調用private的foo}class C extends A { private function foo() { /* original method is replaced; the scope of the new one is C */ //因為c重寫了foo方法,所以scope是c,而test是scope A,所以無法調用private的foo }}$b = new B();$b->test();echo "--------分隔線,下面是c類相關調用\n";$c = new C();$c->test(); //fails?>以上常式會輸出:success!---------object(B)#1 (0) {}success!+++++++++--------分隔線,下面是c類相關調用success!---------object(C)#2 (0) {}Fatal error: Call to private method C::foo() from context 'A'
目前還不知道怎麼證明,但是可以知道一些東西,這個不是static範圍,所以有所屬的scope,而函數本身的scope只能是自己,而不能是別人,即使是繼承,除非用parent::來傳遞scope