您好,登錄后才能下訂單哦!
總結下,使用靜態成員是為了保證在腳本周期里不被重新初始化,因此避免對類進行實例化而是用類名直接調用或者訪問(第一次調用或者訪問的時候生成單例對象,再調用的時候直接返回這個單例對象)。
在MVC中常被用作以工廠模式生成表Model類單例對象,工廠類中設置一個static $list數組成員保存所有生成的表Model單例。如下Factory.class.php(Factory類會自動加載):
class Factory{ public static function M($class_name=''){ static $object_list=array(); //因為是static成員所以不會被清空,注意這里保存的是object數據類型 if (isset($object_list[$class_name])) { //如果已經存在,直接返回該對象 return $object_list[$class_name]; }else{ //對象數組中不存在,第一次調用,則實例化該類,并把對象保存到數組中 $object_list[$class_name]=new $class_name(); return $object_list[$class_name]; //返回剛剛生成的對象 } } }
這樣在賦值時使用$xx=Factory::M('表名'); 即可獲得單例對象了。所謂工廠模式聽著高大上,其實就是個對象倉庫類吧,對于表間結構不復雜的小型web開發,感覺工廠模式沒什么太大用,不如require_once然后new來的直接。而且工廠模式說是為了保證單例,可是畢竟還多了一個Factory對象呢。
========
靜態變量
是只存在于函數作用域的變量, 不過, 在函數執行完成后,這種變量的值不會丟失,也就是說, 在下一次調用這個函數時,變量仍然會記得原來的值. 要將某個變量定義為靜態的, 只需要在變量前加上 static 關鍵字即可.
類中靜態元素的使用
在類中, static 關鍵字有兩種主要用法, 一是用來定義靜態成員,一是用來定義靜態方法. 在類的內部, 可以使用作用域限定符 (::) 來訪問不同層次作用域的變量.
靜態成員
靜態成員是一種類變量, 可以把它看成時屬于整個類而不是屬于類的某個實例. 與一般的實例變量不同的是, 靜態成員只保留一個變量值, 而這個變量值對所有的實例都是有效的, 也就是說, 所有的實例共享這個成員.
$this 只表示類的當前實例, 而 self:: 表示的是類本身,在類之外的代碼中不能使用這個操作符,而且它不能識別自己在繼承樹層次結構中的位置.
也就是說, 在擴展類中使用self 作用域時, self 可以調用基類中聲明的方法, 但它調用的總是已經在擴展類中重寫的方法. 與$this 不同的是, 在使用靜態變量時,必須在作用域限定符后面加上$符號.
在擴展類中, 在基類的方法被重寫的情況下,使用 parent 作用域調用定義在基類中的方法.靜態成員也可以只屬于父類. 如果在子類和父類中同時聲明了某個成員,也可以使用parant:: 在子類中訪問父類中的變量. 在這種情況下, 父類的靜態成員和子類的靜態成員保存的是不同的值.
可以在 :: 操作符的左邊寫上類的名稱來靜態地訪問某個成員, 這樣避免創建類的實例. 不僅省略掉實例化類的代碼, 而且還會更高效, 因為類的每個實例都會占用一小部分的系統資源.
在使用 :: 操作符訪問成員變量時, 需要再次注意對$符號的使用. 因為PHP當前不支持動態的靜態變量的使用, 也就是說不支持可變的靜態變量. 在使用$this->$var時, 被訪問的成員是包含在$var中的變量的值. 而不用$符號訪問某個變量實際上查找的是類的某個常量, 而常量是不能通過$this來訪問的.
PHP6 中提出的static:: 作用域使我們不再需要使用self:: 和parent::. 當希望指向最終的實現功能的類時, 就可以使用static::, 這個限定符會在代碼執行之前立即計算出繼承層次機構上最后那個類的成員. 之一過程被稱為延遲綁定, 它使我們可以在子類中重寫某個靜態變量, 并且也可以從某個在父類中聲明的函數中反問這個最終成員.
靜態方法
靜態方法和非靜態方法之間有一個重要的區別: 在調用靜態方法時, 不再需要擁有類的實例.
靜態方法和非靜態方法使用原則:
一是如果某個方法中不包含$this 變量, 就應該時靜態方法; 如果不需要類的實例, 可能還應該使用靜態類, 這樣可以免去實例化類的工作. 另, 在靜態方法中時不能使用$this 變量的, 因為靜態方法不屬于某個特定的實例.
PHP中使用作用域限定操作符時, 用變量作為類的名稱時不允許的.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。