溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MVC - php靜態(tài)變量, 成員和方法

發(fā)布時(shí)間:2020-07-06 09:09:21 來源:網(wǎng)絡(luò) 閱讀:426 作者:jia_xl 欄目:web開發(fā)

總結(jié)下,使用靜態(tài)成員是為了保證在腳本周期里不被重新初始化,因此避免對類進(jìn)行實(shí)例化而是用類名直接調(diào)用或者訪問(第一次調(diào)用或者訪問的時(shí)候生成單例對象,再調(diào)用的時(shí)候直接返回這個(gè)單例對象)。

在MVC中常被用作以工廠模式生成表Model類單例對象,工廠類中設(shè)置一個(gè)static $list數(shù)組成員保存所有生成的表Model單例。如下Factory.class.php(Factory類會(huì)自動(dòng)加載):

class Factory{
    public static function M($class_name=''){
        static $object_list=array(); //因?yàn)槭莝tatic成員所以不會(huì)被清空,注意這里保存的是object數(shù)據(jù)類型
        if (isset($object_list[$class_name])) {
            //如果已經(jīng)存在,直接返回該對象
            return $object_list[$class_name];
        }else{
            //對象數(shù)組中不存在,第一次調(diào)用,則實(shí)例化該類,并把對象保存到數(shù)組中
            $object_list[$class_name]=new $class_name();
            return $object_list[$class_name];  //返回剛剛生成的對象
        }
    }
}

這樣在賦值時(shí)使用$xx=Factory::M('表名'); 即可獲得單例對象了。所謂工廠模式聽著高大上,其實(shí)就是個(gè)對象倉庫類吧,對于表間結(jié)構(gòu)不復(fù)雜的小型web開發(fā),感覺工廠模式?jīng)]什么太大用,不如require_once然后new來的直接。而且工廠模式說是為了保證單例,可是畢竟還多了一個(gè)Factory對象呢。


========

靜態(tài)變量

是只存在于函數(shù)作用域的變量, 不過, 在函數(shù)執(zhí)行完成后,這種變量的值不會(huì)丟失,也就是說, 在下一次調(diào)用這個(gè)函數(shù)時(shí),變量仍然會(huì)記得原來的值. 要將某個(gè)變量定義為靜態(tài)的, 只需要在變量前加上 static 關(guān)鍵字即可.

類中靜態(tài)元素的使用
在類中, static 關(guān)鍵字有兩種主要用法, 一是用來定義靜態(tài)成員,一是用來定義靜態(tài)方法. 在類的內(nèi)部, 可以使用作用域限定符 (::) 來訪問不同層次作用域的變量.


靜態(tài)成員
靜態(tài)成員是一種類變量, 可以把它看成時(shí)屬于整個(gè)類而不是屬于類的某個(gè)實(shí)例. 與一般的實(shí)例變量不同的是, 靜態(tài)成員只保留一個(gè)變量值, 而這個(gè)變量值對所有的實(shí)例都是有效的, 也就是說, 所有的實(shí)例共享這個(gè)成員.
$this 只表示類的當(dāng)前實(shí)例, 而 self:: 表示的是類本身,在類之外的代碼中不能使用這個(gè)操作符,而且它不能識別自己在繼承樹層次結(jié)構(gòu)中的位置.
也就是說, 在擴(kuò)展類中使用self 作用域時(shí), self 可以調(diào)用基類中聲明的方法, 但它調(diào)用的總是已經(jīng)在擴(kuò)展類中重寫的方法. 與$this 不同的是, 在使用靜態(tài)變量時(shí),必須在作用域限定符后面加上$符號.
在擴(kuò)展類中, 在基類的方法被重寫的情況下,使用 parent 作用域調(diào)用定義在基類中的方法.靜態(tài)成員也可以只屬于父類. 如果在子類和父類中同時(shí)聲明了某個(gè)成員,也可以使用parant:: 在子類中訪問父類中的變量. 在這種情況下, 父類的靜態(tài)成員和子類的靜態(tài)成員保存的是不同的值.
可以在 :: 操作符的左邊寫上類的名稱來靜態(tài)地訪問某個(gè)成員, 這樣避免創(chuàng)建類的實(shí)例. 不僅省略掉實(shí)例化類的代碼, 而且還會(huì)更高效, 因?yàn)轭惖拿總€(gè)實(shí)例都會(huì)占用一小部分的系統(tǒng)資源.
在使用 :: 操作符訪問成員變量時(shí), 需要再次注意對$符號的使用. 因?yàn)镻HP當(dāng)前不支持動(dòng)態(tài)的靜態(tài)變量的使用, 也就是說不支持可變的靜態(tài)變量. 在使用$this->$var時(shí), 被訪問的成員是包含在$var中的變量的值. 而不用$符號訪問某個(gè)變量實(shí)際上查找的是類的某個(gè)常量而常量是不能通過$this來訪問的.
PHP6 中提出的static:: 作用域使我們不再需要使用self:: 和parent::. 當(dāng)希望指向最終的實(shí)現(xiàn)功能的類時(shí), 就可以使用static::, 這個(gè)限定符會(huì)在代碼執(zhí)行之前立即計(jì)算出繼承層次機(jī)構(gòu)上最后那個(gè)類的成員. 之一過程被稱為延遲綁定, 它使我們可以在子類中重寫某個(gè)靜態(tài)變量, 并且也可以從某個(gè)在父類中聲明的函數(shù)中反問這個(gè)最終成員.


靜態(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í)例.

PHP中使用作用域限定操作符時(shí), 用變量作為類的名稱時(shí)不允許的.


向AI問一下細(xì)節(jié)
推薦閱讀:
  1. MVT和MTV
  2. jquery 插件庫

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI