您好,登錄后才能下訂單哦!
靜態修飾符static的使用場景有哪些?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
一、什么是static修飾符
許多書和人都喜歡把static稱之為靜態,但我不喜歡這樣稱呼它,我更喜歡直接叫它static。因為我認為靜態這兩個字無法真正表達出static的真正作用。在程序中任何變量或者成員都是在編譯時由系統自動分配內存來存儲的,而用static修飾的成員會存儲在一個static內存區中并且一直存在,直到程序退出內存才會釋放這個空間,也就是只要程序在運行,那么這塊內存就會一直存在。那么這樣的設計有什么意義了?在面向對象的概念中,這樣的設計可是十分有意義的!因為這樣的設計,static可以用來區分成員變量、方法是屬于類本身還是屬于類實例化后的對象。有static修飾的成員屬于類本身,沒有static修飾的成員屬于類的實例。
可能很多人還是不能理解,我在這邊快速簡單的寫個例子吧。
class a{ public $aa = 1; public function aa(){ $this->aa += 1; echo $this->aa; } } class b{ public function bb(){ $aaa = new a(); $aaa->aa(); } } class c{ public function cc(){ $aaa = new a(); $aaa->aa(); } } $bbb = new b(); $ccc = new c(); $bbb->bb(); echo '*******************'; $ccc->cc();
注:在"this->aa"里面的"->"是php調用方法的方式類似于java里面的"."
上面代碼很簡單相信大家都能理解,我就不解釋了。運行后的結果是2*******************2。
上面的代碼是沒用static的情況,下面我就再寫一個用了static的demo。
class a{ public static $aa = 1; public static function aa(){ self::$aa += 1; echo self::$aa; } } class b{ public function bb(){ a::aa(); } } class c{ public function cc(){ a::aa(); } } $bbb = new b(); $ccc = new c(); $bbb->bb(); echo '*******************'; $ccc->cc();
注:"self::"和"::"是php中調用static修飾的成員的方式。里面的差異與本文要探討的內容關系不大,咱不解釋,有興趣的可以自行研究。
最后的運行結果是2*******************3。這說明了,在static修飾下的成員變量$aa在第一次調用后并沒有被釋放,而是依然存在static內存塊中,所有在第二次調用后輸出的結果是3。因為第一次調用后的變量$aa從1變成了2,第二次調用的時候$aa還是2,所有二次調用后$aa變成了3。這就是static修飾的變量會一直存在的體現。同時,要記住在面向對象的編程中static修飾的成員不能直接調用非static修飾的成員。如果你知道了static的原理這個就很好理解了。拿java舉例,用static修飾的成員,是專門存儲在一個static內存區里面。非static修飾的成員是存儲在堆內存里面。兩者是分開存儲的,所以要想在static修飾的成員里面調用非static修飾的成員,就必須跟在外面調用一樣,先實例化,在調用。對于那為什么可以在非static修飾的成員里面直接調用static修飾的成員這個問題,我的解釋是,你在類外面調用static成員時不也是可以不實例化類就直接調用嗎?更何況在類里面了?
雖然可以在非static修飾的成員里面直接調用static修飾的成員,但是我強烈建議大家不要這么做!原因后面會提到。
二、什么時候使用static修飾符
理解了上面說的,你只是初步了解了static,要想更近一步的理解static,就要讀懂這句話:"static可以用來區分成員變量、方法是屬于類本身還是屬于類實例化后的對象。有static修飾的成員屬于類本身,沒有static修飾的成員屬于類的實例。"很多初學者會搞不懂類和類的實例有什么不同?類是抽象的存在,而類的實例是類具體化的存在。兩者是有區別的,因此就會發生一種情況,那就是有些類實例化后沒有任何意義,也就是說沒有實例化的必要,只有作為類才有意義。這時候,就必須用static來修飾成員變量和方法,表明這些變量和方法只屬于類本身。比如:在做一個項目的時候,一個合格的軟件工程師都會封裝一個公共方法類,將經常用的公共方法放在里面,以便隨時在項目中調用。這時候,你會發現,這個公共方法類,并沒有一個合適的具體化的實例可以來表示,只有作為類的時候,才有其意義。所以里面的公共方法都可以用static來修飾,以表示這些方法都屬于類本身,就不需要每一次使用一個公共方法的時候都要實例化出一個具體的對象了。還有就是像做安全防范(sql注入過濾、xss過濾等)的時候,將其統一封裝成一個Security類,里面的方法就需要用到static來修飾,不然難道每一次過濾都要實例化一次嗎?再開一個堆內存空間?類似的還有語言包、緩存等等。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。