首頁 >php框架 >ThinkPHP >詳解ThinkPHP 5.1修改Cache源碼

詳解ThinkPHP 5.1修改Cache源碼

藏色散人
藏色散人轉載
2021-03-12 11:37:241921瀏覽

下面由thinkphp教學專欄給大家詳解ThinkPHP 5.1修改Cache原始碼,希望對需要的朋友有幫助!

詳解ThinkPHP 5.1修改Cache源碼

ThinkPHP 5.1 修改Cache 原始碼

導語

最近在學習THinkPHP 5.1,看了Cache 方法的操作,有一點疑惑。雖然封裝了很多方法,使用的時候很方便,但是對 Redis 的高級操作好像不是很友好,出於學習的目的,對源碼進行了一點小修改。首先聲明兩點:一是此次的修改,只是個人觀點,不適於所有人;二是此次修改僅為學習所用,各位謹慎修改源碼

問題

在練習Redis 的時候,發現如果想要使用高階方法,例如hSethGet 等,要先回傳句柄,然後才能執行。如下

<?php

namespace app\index\controller;

use think\cache\driver\Redis;
use think\Controller;

class RedisTest extends Controller
{
    public function index()
    {
        $redis = new Redis();
        $redis = $redis->handler();

        dump($redis->hSet('h_name', '1', 'tom'));// int(1)
    }
}

可以看到,執行成功。問題是為什麼要先回傳句柄,可以用 __call 這種魔術方法來解決的。

追蹤原始碼

既然有了疑惑,就要解惑。追蹤著原始碼,看到thinkphp/library/think/cache/Driver.php,發現確實沒有__call,只是handler 來傳回句柄來執行高階方法。沒想明白為什麼不用 __clss

解決問題

解決方法就是在thinkphp/library/think/cache/Driver.php  中加入__call 方法,這樣不只Redis 可以直接使用進階方法,其他繼承此檔案的Cache 類別都可以直接使用。程式碼如下

     /**
     * 执行高级方法
     * @param $method
     * @param $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        return call_user_func_array(array($this->handler(), $method), $parameters);
    }

再看下測試程式碼

<?php

namespace app\index\controller;

use think\cache\driver\Redis;
use think\Controller;

class RedisTest extends Controller
{
    public function index()
    {
        $redis = new Redis();
//        $redis = $redis->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);
    }

結語

#其實這次小修改的象徵意義大於實際意義,畢竟這不是bug,使用handler  也是可以實現的。對我來說更大的意義是,遇到一些問題會更傾向於查看原始碼。看得多了,自然能力會提升。

以上是詳解ThinkPHP 5.1修改Cache源碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除