当前位置: 首页 > 后端技术 > PHP

ThinkPHP5.1修改Cache源码

时间:2023-03-29 14:29:59 PHP

介绍最近在学习THinkPHP5.1,看到Cache方法的运行有点懵。虽然封装了很多方法,使用起来也很方便,但是对于Redis的高级操作似乎不是很友好。出于学习的目的,对源码做了小的修改。首先声明两点:一是本次修改仅代表个人意见,并不适合所有人;另一种是本次修改仅供学习,大家修改源码需谨慎。问题在练习Redis时,发现如果要使用高级方法,如hSet、hGet等,必须先返回句柄,然后再执行。如下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*@returnmixed*/publicfunction__call($method,$parameters){returncall_user_func_array(array($this->handler(),$方法),$参数);}再看测试代码handler();dump($redis->hSet('h_name','2','jerry'));//int(1)}}这里问题解决了。等我修改完,想起Laravel好像用了__call,然后去看源码,果然如此。在ravel/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php中有以下代码/***将方法传递到默认的Redis连接。**@param字符串$method*@paramarray$parameters*@returnmixed*/publicfunction__call($method,$parameters){return$this->connection()->{$method}(...$parameters);毕竟这不是bug,可以使用handlers来实现。对我来说更大的意义在于,遇到一些问题的时候,我会更倾向于查看源码。看多了,天生的能力就会提高。参考资料:魔术方法、THinkPHP缓存、Laravelredis、call_user_func_array。