巧用PHP中__get()魔术方法
PHP中的魔術方法有很多,這些魔術方法可以讓PHP腳本在某些特定的情況下自動調(diào)用。比如 __construct() 每次實例化一個類都會先調(diào)用該方法進行初始化。這里我們講一下__get() 魔術方法的使用。讀取不可訪問屬性的值時,__get() 會被調(diào)用。也就是,當想要獲取一個類的私有屬性,或者獲取一個類并為定義的屬性時。該魔術方法會被調(diào)用。
下面有段代碼:
class Model {//不存在的成員屬性自動調(diào)用function __get($name) {//自動加載數(shù)據(jù)庫if(substr($name, 0,2) =='db'){$config = strtolower(substr($name, 2));if(empty($this->objDb)){$this->objDb = new LibDatabase($config);}else{$this->objDb->config($config);}return $this->objDb; }// 自動加載redisif(substr($name, 0,5) =='redis'){$config = strtolower(substr($name, 5));if(empty($this->objRedis)){$this->objRedis = new LibRedis($config);}else{$this->objRedis->config($config);}return $this->objRedis;}//自動加載excel插件if(substr($name, 0,5) =='excel'){if(empty($this->objExcel)){$this->objExcel = new LibExcel();}return $this->objExcel;}throw new LinkException("變量{$name}不被支持,請預先Model中定義",EXCEPT_CORE);} }?>?
首先,該Model類有只有一個__get() 方法,沒有定義其他屬性,所有只要是訪問這個Model類的屬性,都會來調(diào)用這個__get() 方法。而傳入的參數(shù)$name就是想要調(diào)用Model類的屬性。
其次,__get() 方法里有3個判斷,分別用于返回一個LibDatabase數(shù)據(jù)庫類和一個LibRedis緩存類和一個LibExcel 的Excel插件類的實例。
?
假設$mod 是Model的一個對象。我們來分析以下三中情況:
1、$mod->dbconfsys->getAll($sql);
2、$mod->redisconfsys->get($key);
3、$mod->excel->export($data);
第一個:訪問Model類的dbconfsys屬性。但是Model類中并沒有該屬性。所以 __get() 的第一個判讀成立,那么會返回LibDatabase(‘confsys’)的實例。這里confsys其實是一個數(shù)據(jù)庫的配置。如果有多個數(shù)據(jù)庫的配置比如confadmin、conftest等,都可以使用dbconfadmin和dbconftest來實例化該數(shù)據(jù)庫的一個連接對象。當然連接的處理以及數(shù)據(jù)處理是在LibDatabase里實現(xiàn)的。最后調(diào)用該實例的getAll方法執(zhí)行sql語句。
第二個:訪問Model類的redisconfsys屬性,同理,此時 __get() 的第二個判斷成立。返回的是LibRedis(‘confsys’)的實例。這里的confsys則是一個redis的配置。像數(shù)據(jù)庫實例一樣,如果有多個配置,也是同樣的處理方式。最后調(diào)用該實例的get方法獲取某個鍵的值。
第三個:訪問Model類的excel 屬性,此時__get() 的第三個判斷成立。返回的是LibExcel()的實例。最后調(diào)用export方法導出數(shù)據(jù)。
這個Model類可以作為基礎的底層模型。然后系統(tǒng)中所有數(shù)據(jù)表的模型或者每個模塊功能的模型都繼承Model,同樣可以使用該Model的功能,這里需要注意的是每種對象的調(diào)用都需要先早Model中做好判斷處理。
轉(zhuǎn)載于:https://www.cnblogs.com/LO-gin/p/9379279.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的巧用PHP中__get()魔术方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018牛客网暑假ACM多校训练赛(第三
- 下一篇: php中关于empty()函数是否为真的