1、靜態屬性、靜態方法
在面向對象編程中,我們不僅可以通過對象訪問方法和屬性,還可以通過類來訪問它們。這樣的方法和屬性就是“靜態的”(static),必須用static關鍵字來聲明。
class staticExample {
staticpublic $num = 0;
staticpublic function sayNum() {
echoself::num;
}
}
靜態方法是以類作爲作用域的函數。靜態方法不能訪問這個類中的普通屬性,因爲那些屬性屬於一個對象,但可以訪問靜態屬性。如果修改了一個靜態屬性,那麼這個類的所有實例都能訪問到這個新值。
因爲通過類現而不是實例來訪問靜態元素,所以訪問靜態元素時不需要引用對象的變量,而是使用 :: (兩個冒號)來連接類名和屬性或類名和方法。
echostaticExample::$num;
staticExample::sayNum();
要從當前類(不是子類)中訪問靜態方法或屬性,可以使用self關鍵字。self指向當前類,就像僞變量$this指向當前對象一樣。因此,在staticExample類的外部可以使用類名來訪問屬性$num:
staticExample::$num
而在staticExample類內部,可以使用self關鍵字
使用原因:
1、它們在代碼中的任何地方都可用(假設你可以訪問該類),也就是說,你不需要在對象間傳遞類的實例,也不需要將實例存放在全局變量中,就可以訪問類中的方法
2、類的每個實例都可以訪問類中定義的靜態屬性,所以可以利用靜態屬性來設置值,該值可以被類的所有對象使用
3、不需要實例化對象,就能訪問靜態屬性或方法,這樣我們就不用爲了獲取一個簡單的功能而實例化對象
2、常量屬性
有些屬性是不能改變的
在PHP 5可以在類中定義常量屬性,和全局變量一樣,類常量一旦設置後就不能改變。常量屬性用const關鍵字來聲明。常量不像常規屬性那樣以 $ 開頭。按照慣例,只能用大寫字母來命名常量,如下所示:
class shopProduct {
constAVAILABLE = 0;
//…
}
常量屬性只包含基本數據類型的值。不能將一個對象指派給常量。像靜態屬性一樣,只能通過類而不能通過類的實例訪問常量屬性。引用常量時不需要用 $ 作爲前導符,如下所示:
echoshopProduct::AVAILABLE;
給已經聲明過的常量賦值會引起解析錯誤。
當需要在類的所有實例中都能訪問某個屬性,並且屬性值無需改變時,應該使用常量。
轉自:[深入PHP面向對象、模式與實踐(第2版)].(美)贊德斯徹.中文版