日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

巧用PHP中__get()魔术方法

發(fā)布時(shí)間:2024/1/17 php 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 巧用PHP中__get()魔术方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PHP中的魔術(shù)方法有很多,這些魔術(shù)方法可以讓PHP腳本在某些特定的情況下自動(dòng)調(diào)用。比如 __construct() 每次實(shí)例化一個(gè)類(lèi)都會(huì)先調(diào)用該方法進(jìn)行初始化。這里我們講一下__get() 魔術(shù)方法的使用。讀取不可訪問(wèn)屬性的值時(shí),__get() 會(huì)被調(diào)用。也就是,當(dāng)想要獲取一個(gè)類(lèi)的私有屬性,或者獲取一個(gè)類(lèi)并為定義的屬性時(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類(lèi)有只有一個(gè)__get() 方法,沒(méi)有定義其他屬性,所有只要是訪問(wèn)這個(gè)Model類(lèi)的屬性,都會(huì)來(lái)調(diào)用這個(gè)__get() 方法。而傳入的參數(shù)$name就是想要調(diào)用Model類(lèi)的屬性。

其次,__get() 方法里有3個(gè)判斷,分別用于返回一個(gè)LibDatabase數(shù)據(jù)庫(kù)類(lèi)和一個(gè)LibRedis緩存類(lèi)和一個(gè)LibExcel 的Excel插件類(lèi)的實(shí)例。

?

假設(shè)$mod 是Model的一個(gè)對(duì)象。我們來(lái)分析以下三中情況:

1、$mod->dbconfsys->getAll($sql);

2、$mod->redisconfsys->get($key);

3、$mod->excel->export($data);

第一個(gè):訪問(wèn)Model類(lèi)的dbconfsys屬性。但是Model類(lèi)中并沒(méi)有該屬性。所以 __get() 的第一個(gè)判讀成立,那么會(huì)返回LibDatabase(‘confsys’)的實(shí)例。這里confsys其實(shí)是一個(gè)數(shù)據(jù)庫(kù)的配置。如果有多個(gè)數(shù)據(jù)庫(kù)的配置比如confadmin、conftest等,都可以使用dbconfadmin和dbconftest來(lái)實(shí)例化該數(shù)據(jù)庫(kù)的一個(gè)連接對(duì)象。當(dāng)然連接的處理以及數(shù)據(jù)處理是在LibDatabase里實(shí)現(xiàn)的。最后調(diào)用該實(shí)例的getAll方法執(zhí)行sql語(yǔ)句。

第二個(gè):訪問(wèn)Model類(lèi)的redisconfsys屬性,同理,此時(shí) __get() 的第二個(gè)判斷成立。返回的是LibRedis(‘confsys’)的實(shí)例。這里的confsys則是一個(gè)redis的配置。像數(shù)據(jù)庫(kù)實(shí)例一樣,如果有多個(gè)配置,也是同樣的處理方式。最后調(diào)用該實(shí)例的get方法獲取某個(gè)鍵的值。

第三個(gè):訪問(wèn)Model類(lèi)的excel 屬性,此時(shí)__get() 的第三個(gè)判斷成立。返回的是LibExcel()的實(shí)例。最后調(diào)用export方法導(dǎo)出數(shù)據(jù)。

這個(gè)Model類(lèi)可以作為基礎(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ì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的巧用PHP中__get()魔术方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。