>PHP 프레임워크 >ThinkPHP >ThinkPHP 5.1에서 Cache 소스 코드를 수정하는 방법에 대한 자세한 설명

ThinkPHP 5.1에서 Cache 소스 코드를 수정하는 방법에 대한 자세한 설명

藏色散人
藏色散人앞으로
2021-03-12 11:37:241924검색

다음 튜토리얼 칼럼인 thinkphp에서는 ThinkPHP 5.1의 캐시 소스 코드를 수정하는 방법에 대해 자세히 설명합니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

ThinkPHP 5.1에서 Cache 소스 코드를 수정하는 방법에 대한 자세한 설명

ThinkPHP 5.1 캐시 소스 코드 수정

Introduction

저는 최근 THinkPHP 5.1을 배우고 있는데 Cache 메소드의 동작을 보고 조금 헷갈렸습니다. 많은 메소드를 캡슐화하고 사용하기 매우 편리하지만, Redis의 고급 작업에 그다지 친숙하지는 않은 것 같습니다. 학습을 위해 소스 코드를 약간 수정했습니다. 우선, 두 가지 사항을 선언하고 싶습니다. 첫째, 이 수정 사항은 개인적인 의견일 뿐 모든 사람에게 적합하지 않습니다. 둘째, 이 수정 사항은 학습용이므로 소스 코드를 수정할 때 주의하시기 바랍니다. Question

Redis를 연습하면서 hSet, hGet 등과 같은 고급 메서드를 사용하려면 먼저 핸들을 반환해야 한다는 것을 알았습니다. 실행. 아래에서 볼 수 있듯이

<?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이라는 매직 메서드로 해결할 수 있습니다. hSethGet 等,要先返回句柄,然后才能执行。如下

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

可以看到,执行成功。问题是为什么要先返回句柄,可以用 __call 这种魔术方法来解决的。

追踪源码

既然有了疑惑,就要解惑。追踪着源码,看到 thinkphp/library/think/cache/Driver.php,发现确实没有 __call,只是 handler 来返回句柄来执行高级方法。没想明白为什么不用 __clss

解决问题

解决方法就是在 thinkphp/library/think/cache/Driver.php  中添加 __call 方法,这样不止 Redis 可以直接使用高级方法,其他继承此文件的 Cache 类都可以直接使用。代码如下

<?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)
    }
}

再看下测试代码

     /**
     * 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);
    }

到此问题已解决。当我修改完的时候,想起 Laravel 似乎就是用的 __call,然后去看了源码,确实如此。在 ravel/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php 中有如下代码

rrreee

结语

其实这次小修改的象征意义大于实际意义,毕竟这不是什么 bug,使用 handler

소스 코드를 추적하세요
🎜의심스러운 점이 있으니 이를 해결해야 합니다. 소스 코드를 추적한 후 thinkphp/library/think/cache/Driver.php를 보았는데 실제로 __call은 없고 핸들러만 있음을 발견했습니다. > 핸들을 반환하려면 고급 메서드를 실행하세요. __clss가 사용되지 않는 이유를 이해할 수 없습니다. 🎜🎜문제 해결🎜🎜해결책은 thinkphp/library/think/cache/Driver.php__call 메서드를 추가하여 Redis뿐만 아니라 고급 기능을 사용할 수 있도록 하는 것입니다. 메소드를 직접 사용할 수 있지만 이 파일을 상속하는 다른 Cache 클래스도 직접 사용할 수 있습니다. 코드는 다음과 같습니다🎜rrreee🎜테스트 코드를 다시 살펴보세요🎜rrreee🎜이 문제는 해결되었습니다. 수정을 마치고 나니 라라벨이 __call을 사용하는 것 같다는 생각이 나서 소스코드를 살펴보니 정말 그랬습니다. ravel/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php에 다음 코드가 있습니다🎜rrreee🎜Conclusion🎜🎜사실 이 작은 수정의 상징적 의미는 실제 의미는 그렇지 않습니다. 핸들러를 사용하면 어떤 버그도 실현할 수 없습니다. 나에게 더 큰 의미는 어떤 문제에 직면했을 때 소스 코드를 확인하려는 경향이 더 크다는 것입니다. 많이 시청할수록 능력은 자연스럽게 향상될 것입니다. 🎜🎜

위 내용은 ThinkPHP 5.1에서 Cache 소스 코드를 수정하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제