摘要:首先聲明兩點(diǎn)一是此次的修改,只是個(gè)人觀點(diǎn),不適于所有人二是此次修改僅為學(xué)習(xí)所用,各位謹(jǐn)慎修改源碼。追蹤源碼既然有了疑惑,就要解惑。對(duì)我來(lái)說(shuō)更大的意義是,遇到些問題會(huì)更傾向于查看源碼。
導(dǎo)語(yǔ)
最近在學(xué)習(xí) THinkPHP 5.1,看了 Cache 方法的操作,有一點(diǎn)疑惑。雖然封裝了很多方法,使用的時(shí)候很方便,但是對(duì) Redis 的高級(jí)操作好像不是很友好,出于學(xué)習(xí)的目的,對(duì)源碼進(jìn)行了一點(diǎn)小修改。首先聲明兩點(diǎn):一是此次的修改,只是個(gè)人觀點(diǎn),不適于所有人;二是此次修改僅為學(xué)習(xí)所用,各位謹(jǐn)慎修改源碼。
問題在練習(xí) Redis 的時(shí)候,發(fā)現(xiàn)如果想要使用高級(jí)方法,例如 hSet、hGet 等,要先返回句柄,然后才能執(zhí)行。如下
handler(); dump($redis->hSet("h_name", "1", "tom"));// int(1) } }
可以看到,執(zhí)行成功。問題是為什么要先返回句柄,可以用 __call 這種魔術(shù)方法來(lái)解決的。
追蹤源碼既然有了疑惑,就要解惑。追蹤著源碼,看到 thinkphp/library/think/cache/Driver.php,發(fā)現(xiàn)確實(shí)沒有 __call,只是 handler 來(lái)返回句柄來(lái)執(zhí)行高級(jí)方法。沒想明白為什么不用 __clss。
解決問題解決方法就是在 thinkphp/library/think/cache/Driver.php 中添加 __call 方法,這樣不止 Redis 可以直接使用高級(jí)方法,其他繼承此文件的 Cache 類都可以直接使用。代碼如下
/** * 執(zhí)行高級(jí)方法 * @param $method * @param $parameters * @return mixed */ public function __call($method, $parameters) { return call_user_func_array(array($this->handler(), $method), $parameters); }
再看下測(cè)試代碼
handler(); dump($redis->hSet("h_name", "2", "jerry"));// int(1) } }
到此問題已解決。當(dāng)我修改完的時(shí)候,想起 Laravel 似乎就是用的 __call,然后去看了源碼,確實(shí)如此。在 ravel/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php 中有如下代碼
/** * Pass methods onto the default Redis connection. * * @param string $method * @param array $parameters * @return mixed */ public function __call($method, $parameters) { return $this->connection()->{$method}(...$parameters); }結(jié)語(yǔ)
其實(shí)這次小修改的象征意義大于實(shí)際意義,畢竟這不是什么 bug,使用 handler 也是可以實(shí)現(xiàn)的。對(duì)我來(lái)說(shuō)更大的意義是,遇到些問題會(huì)更傾向于查看源碼??吹枚嗔?,自然能力會(huì)提升。
參考資料:魔術(shù)方法、THinkPHP 緩存、Laravel redis、call_user_func_array。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/30063.html
摘要:中間件在控制器中使用過(guò)程使用中間件的開始以及我的步驟描述,希望可以幫到才學(xué)或者才學(xué)框架的你們希望能夠與你們交流,讓自己進(jìn)步。 ThinkPHP5.1中間件在控制器中使用過(guò)程 使用中間件的開始以及我的步驟描述,希望可以幫到才學(xué)php 或者才學(xué)think框架的你們希望能夠與你們交流,讓自己進(jìn)步。 中間件在Thinkphp框架中的作用我已經(jīng)明白了,就是在請(qǐng)求即將達(dá)到應(yīng)用層之前,對(duì)用戶訪問資...
摘要:在中添加設(shè)置某些可以訪問指定模塊所有都可以訪問模塊,僅這兩個(gè)可以訪問模塊最好加在這個(gè)位置禁止訪問模塊設(shè)置某些可以訪問指定模塊默認(rèn)控制器名需要修改框架代碼代碼位置如下多模塊部署綁定模塊設(shè)置了限制訪問模塊如模塊初始化初始化模塊模塊請(qǐng)求緩存檢查 在config.php中添加 allow_module_ip => [admin => *], // 設(shè)置某些ip可以訪問指定模塊 [admin =...
摘要:相關(guān)信息,面向過(guò)程,面向?qū)ο螅p量級(jí)。輕量級(jí)功能實(shí)用,面向過(guò)程和面向?qū)ο蠡旌祥_發(fā)。找到文件為文件名為驗(yàn)證碼類沒有在自動(dòng)加載類中載入,需要手動(dòng)載入。底層的和會(huì)影響原始的框架中的引入,可以使用框架中提供的引入。 不使用框架的問題 在實(shí)際工作中,如果不使用框架會(huì)遇到的問題。 程序項(xiàng)目生命時(shí)間非常短(維護(hù)性,生命力弱) 分共協(xié)作開發(fā)項(xiàng)目,彼此代碼風(fēng)格不一致。 開發(fā)程序,喜歡挖坑。 開發(fā)者離職...
摘要:未完待續(xù)端配置里的相關(guān)配置阿里云和在購(gòu)買阿里云時(shí)會(huì)得到,把相應(yīng)的值配置到就行。小結(jié)操作相對(duì)簡(jiǎn)單,本人簡(jiǎn)單介紹了,在下,的相關(guān)配置以及簡(jiǎn)單使用,今天先寫這么多,日后會(huì)有更新。 1.redis簡(jiǎn)介 Redis是一個(gè)開源的使用ANSI C語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù)。(未完待續(xù)...) 2.thinkphp端配置 config.php里的相關(guān)配置...
閱讀 1358·2023-04-26 03:02
閱讀 1546·2023-04-25 19:18
閱讀 2742·2021-11-23 09:51
閱讀 2818·2021-11-11 16:55
閱讀 2779·2021-10-21 09:39
閱讀 1871·2021-10-09 09:59
閱讀 2164·2021-09-26 09:55
閱讀 3691·2021-09-26 09:55