ホームページ  >  記事  >  バックエンド開発  >  ThinkPHP 5.1 でキャッシュのソースコードを変更する方法の紹介 (コード例)

ThinkPHP 5.1 でキャッシュのソースコードを変更する方法の紹介 (コード例)

不言
不言転載
2019-02-11 09:52:432333ブラウズ

この記事では、ThinkPHP 5.1 のキャッシュソースコードを修正する方法 (コード例) を紹介します。一定の参考価値があります。必要な友人は参照してください。お役に立てれば幸いです。

最近 THinkPHP 5.1 を学習しているのですが、Cache メソッドの動作を見た後、少し混乱しています。多くのメソッドがカプセル化されており、非常に便利ですが、Redis の高度な操作にはあまり適していないようで、学習のためにソース コードを少し変更しています。まず、2 つの点を述べておきます。1 つ目は、この修正は単なる個人的な意見であり、すべての人に適しているわけではありません。2 つ目は、この修正は学習のみを目的としており、ソース コードを修正する場合は注意してください。

質問

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 が使用されない理由がわかりません。

問題の解決策

解決策は、__call メソッドを thinkphp/library/think/cache/Driver.php に追加して、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);
    }

結論

には次のコードがあります。実際、この小さな変更は実際的な意味を超えていますが、結局のところ、これはバグではなく、ハンドラーを使用して実現することもできます。私にとってより大きな意味があるのは、問題が発生したときに、ソース コードを確認する傾向が強まるということです。見れば見るほど、自然と能力が向上します。

以上がThinkPHP 5.1 でキャッシュのソースコードを変更する方法の紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。