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