>  기사  >  백엔드 개발  >  ThinkPHP 5.1에서 Cache 소스 코드를 수정하는 방법 소개(코드 예시)

ThinkPHP 5.1에서 Cache 소스 코드를 수정하는 방법 소개(코드 예시)

不言
不言앞으로
2019-02-11 09:52:432314검색

이 글은 ThinkPHP 5.1에서 Cache 소스 코드를 수정하는 방법(코드 예제)을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

최근 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이라는 매직 메서드로 해결할 수 있습니다.

소스 코드 추적

의심스러운 부분이 있으니 이를 해결해야 합니다. 소스 코드를 추적해 보니 thinkphp/library/think/cache/Driver.php가 실제로 __call이 없고 고급 메서드를 실행하기 위해 핸들을 반환하는 핸들러만 있는 것을 발견했습니다. __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)
    }
}

이 문제는 해결되었습니다. 수정을 마치고 나니 라라벨이 __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);
    }

Conclusion

에 다음과 같은 코드가 있습니다. 사실 이 작은 수정의 상징적인 의미는 결국 실제 의미보다 큽니다. , 이것은 버그가 아닙니다. 핸들러를 사용하는 것도 가능합니다. 나에게 더 큰 의미는 어떤 문제에 직면했을 때 소스 코드를 확인하려는 경향이 더 크다는 것입니다. 많이 시청할수록 능력은 자연스럽게 향상될 것입니다.

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

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

관련 기사

더보기