php中的static
靜態(tài)成員是一種類變量,可以把它看成時(shí)屬于整個(gè)類而不是屬于類的某個(gè)實(shí)例。與一般的實(shí)例變量不同的是,靜態(tài)成員只保留一個(gè)變量值,而這個(gè)變量值對(duì)所有的實(shí)例都是有效的,也就是說(shuō),所有的實(shí)例共享這個(gè)成員。
$this只表示類的當(dāng)前實(shí)例,而 self:: 表示的是類本身,在類之外的代碼中不能使用這個(gè)操作符,而且它不能識(shí)別自己在繼承樹層次結(jié)構(gòu)中的位置。也就是說(shuō),在擴(kuò)展類中使用self 作用域時(shí),self 可以調(diào)用基類中聲明的方法,但它調(diào)用的總是已經(jīng)在擴(kuò)展類中重寫的方法。與$this不同的是,在使用靜態(tài)變量時(shí),必須在作用域限定符后面加上$符號(hào)。
在擴(kuò)展類中,在基類的方法被重寫的情況下,使用 parent 作用域調(diào)用定義在基類中的方法。靜態(tài)成員也可以只屬于父類。如果在子類和父類中同時(shí)聲明了某個(gè)成員,也可以使用parant::在子類中訪問(wèn)父類中的變量。在這種情況下,父類的靜態(tài)成員和子類的靜態(tài)成員保存的是不同的值。
可以在 :: 操作符的左邊寫上類的名稱來(lái)靜態(tài)地訪問(wèn)某個(gè)成員,這樣避免創(chuàng)建類的實(shí)例。不僅省略掉實(shí)例化類的代碼,而且還會(huì)更高效,因?yàn)轭惖拿總€(gè)實(shí)例都會(huì)占用一小部分的系統(tǒng)資源。
在使用 :: 操作符訪問(wèn)成員變量時(shí),需要再次注意對(duì)$符號(hào)的使用。因?yàn)镻HP當(dāng)前不支持動(dòng)態(tài)的靜態(tài)變量的使用,也就是說(shuō)不支持可變的靜態(tài)變量。在使用$this->$var時(shí),被訪問(wèn)的成員是包含在$var中的變量的值。而不用$符號(hào)訪問(wèn)某個(gè)變量實(shí)際上查找的是類的某個(gè)常量,而常量是不能通過(guò)$this來(lái)訪問(wèn)的。
PHP6中提出的static::作用域使我們不再需要使用self::和parent::。當(dāng)希望指向最終的實(shí)現(xiàn)功能的類時(shí),就可以使用static::,這個(gè)限定符會(huì)在代碼執(zhí)行之前立即計(jì)算出繼承層次機(jī)構(gòu)上最后那個(gè)類的成員。之一過(guò)程被稱為延遲綁定,它使我們可以在子類中重寫某個(gè)靜態(tài)變量,并且也可以從某個(gè)在父類中聲明的函數(shù)中反問(wèn)這個(gè)最終成員。
有時(shí),可能有必要?jiǎng)?chuàng)建供所有類實(shí)例共享的字段和方法,這些字段和方法與所有的類實(shí)例有關(guān),但不能由任何特定對(duì)象調(diào)用。例如,假設(shè)要編寫一個(gè)類,跟蹤網(wǎng)頁(yè)訪問(wèn)者的數(shù)量。你一定不希望每次實(shí)例化該類時(shí)都把訪問(wèn)者數(shù)量重置為0 ,此時(shí)就可以將該字段設(shè)置為static作用域:
<?phpclass visitors{private static $visitors = 0;function __construct(){self::$visitors++;}static function getVisitors(){return self::$visitors;}}/* Instantiate the visitors class. */$visits = new visitors();echo visitors::getVisitors()."<br />";/* Instantiate another visitors class. */$visits2 = new visitors();echo visitors::getVisitors()."<br />"; ?>?
程序運(yùn)行結(jié)果:
1
2
因?yàn)?visitors字段聲明為static,所以對(duì)其值的任何改變都會(huì)反映到所有實(shí)例化對(duì)象中。還要注意,靜態(tài)字段和方法應(yīng)使用self關(guān)鍵字和類名來(lái)引用,而不是通過(guò)this和箭頭操作符。這是因?yàn)槭褂谩罢!狈椒ㄒ渺o態(tài)字段是不可能的,會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。
不能在類中使用$this來(lái)引用為static字段。
靜態(tài)變量
靜態(tài)變量是只存在于函數(shù)作用域的變量,不過(guò),在函數(shù)執(zhí)行完成后,這種變量的值不會(huì)丟失,也就是說(shuō),在下一次調(diào)用這個(gè)函數(shù)時(shí),變量仍然會(huì)記得原來(lái)的值。要將某個(gè)變量定義為靜態(tài)的,只需要在變量前加上 static 關(guān)鍵字即可。
在類中,static關(guān)鍵字有兩種主要用法,一是用來(lái)定義靜態(tài)成員,一是用來(lái)定義靜態(tài)方法。在類的內(nèi)部,可以使用作用域限定符 (::) 來(lái)訪問(wèn)不同層次作用域的變量。
靜態(tài)方法
靜態(tài)方法和非靜態(tài)方法之間有一個(gè)重要的區(qū)別:在調(diào)用靜態(tài)方法時(shí),不再需要擁有類的實(shí)例。
靜態(tài)方法和非靜態(tài)方法使用原則:一是如果某個(gè)方法中不包含$this變量,就應(yīng)該時(shí)靜態(tài)方法;如果不需要類的實(shí)例,可能還應(yīng)該使用靜態(tài)類,這樣可以免去實(shí)例化類的工作。另,在靜態(tài)方法中時(shí)不能使用$this變量的,因?yàn)殪o態(tài)方法不屬于某個(gè)特定的實(shí)例。
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的php中的static的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: analyze table tablen
- 下一篇: Hadoop数据压缩 与 数据清洗ETL