一、靜態變數
1.靜態變數是只存在於作用域的變量,不過,在函數執行完成以後,這種變數的值不會遺失,也就是說,在下次呼叫這個函數時,變數仍會記得原來的值。
2.將表達式計算出來的結果付給靜態變數是不合法的。表達式是指自身的值會改變的任何語句,例如(1+1),$variable,anyfunc()都是表達式。
3.你也許會想,定義靜態變數似乎並不是很有用,因為可以用全域變數輕鬆地得到同樣的結果。然而,全域變數可以被所有函數訪問,所以如果兩個或更多本來應該是獨立的函數使用了相同名稱的變量,就會導致衝突;並且,比起引入全域變量,使用靜態變數也不需要更多的語法。因此,在只有一個函數需要存取某個變數時,我們應該優先使用靜態變量,而不是全域變數。
二、類別中靜態元素的使用
4.在類別中,static關鍵字有兩種主要的用法,一種是用來定義靜態成員,另一種是用來定義靜態方法。
5.靜態成員是一種類別變量,可以把它看成是屬於整個類別而不是屬於類別的某個實例。與一般的實例變數不同的是,靜態成員只保留一個變數值,而這個變數值對所有的實例都是有效的,也就是說,所有的實例共享這個成員。
6.$this只表示當前類別的實例,self::表示類別本身(後面加$)
7.作用域限定運算符::
透過作用域限定操作符,我們可以使用兩個系統定義的作用域:self和parent。此外,php5.3也提供了static作用域。 self表示的是目前類別的作用域,不過與$this不同的是,它不表示類別的某個特定的實例。在類別以外的程式碼中不能使用這個操作符,而且它不能辨識自己在繼承樹層次結構中的位置。也就是說,在擴充類別中使用self作用域時,self可以呼叫基底類別中宣告的方法,但它所呼叫的總是已經在擴充類別中重寫的方法。 (相當於java中方法的覆蓋,明確呼叫父類別的方法用parent)
重寫父類別的靜態變數在子類別中定義一樣的靜態變數
Php程式碼
class aaa { function bbb(){ bb/c//c8000000000m); ?>
兩種方法得到的結果是一樣的.
想不明白,為什麼普通方法bbb也可以直接用類名::調用,這好像和java裡面的不一樣
Java代碼 Test.java
class Test{
}
//靜態方法
public static
}
//main方法
public static void main(String args[]){
Test obj=newm5();
obj.show( );//方法屬於類別,類別的實例當然也能訪問,但是eclipse等編輯器中會黃色提示建議用類別名稱直接呼叫
/ a static way)
Test.show();//輸出static
() php卻可以忍受。 。 。
}
}
個人理解:只要被調用的普通方法裡不出現$this->xx ($this只表示當前類別的實例),普通方法也可以認為是直接屬於類別的,所以可以直接用類別名稱調用,而不像java中方法必須宣告為static才能用類別名稱直接呼叫(php6在靜態方法的操作方面做了幾個修改,首先在訪問非靜態方法時,不再使用::操作符!這種方式要被幹掉了吧。當希望指向最終的實作類別時,就可以使用static::,這個限定符會在程式碼執行之前立即計算出繼承層次結構上最後那個類別的成員。這一過程被稱為延遲綁定。好像沒看出有什麼用,直接在父類別中new那個最終實作類別的物件然後呼叫不就行了嗎?但是如果你不知道那個最終類別叫什麼,覆蓋的方法實現了什麼樣的效果,這時候似乎就有用了。 static::作用域也可以應用在靜態方法上,這樣從父類別可以靜態的呼叫子類別的方法。