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