ThinkPHP 5.1 でキャッシュのソースコードを変更する方法の詳細な説明

藏色散人
リリース: 2021-03-15 09:03:07
転載
1878 人が閲覧しました

次のチュートリアル コラムでは、ThinkPHP 5.1 のキャッシュ ソース コードを変更する方法について詳しく説明します。困っている友人の役に立てば幸いです。

ThinkPHP 5.1 キャッシュのソース コードの変更ThinkPHP 5.1 でキャッシュのソースコードを変更する方法の詳細な説明

はじめに

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

質問Redis を練習しているときに、

hSet

hGet

などの高度なメソッドを使用したい場合は、最初にハンドルを返す必要があります。その後、ハンドルを実行できます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?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-&gt;handler();         dump($redis-&gt;hSet('h_name', '1', 'tom'));// int(1)     } }</pre><div class="contentsignin">ログイン後にコピー</div></div> の下にあるように、実行は成功しました。問題は、なぜ最初にハンドルを返さなければならないのかということですが、これは魔法のメソッド __call を使用して解決できます。

ソース コードの追跡疑問があるので、それを解消する必要があります。ソース コードを追跡すると、

thinkphp/library/think/cache/Driver.php

が表示され、実際には

__call

がなく、返されるのは handler だけであることがわかりました。高度なメソッドを実行するためのハンドル。なぜ __clss が使用されないのかわかりません。 問題の解決解決策は、

thinkphp/library/think/cache/Driver.php

__call

メソッドを追加することです。 Redis だけが高レベルのメソッドを直接使用できるわけではなく、このファイルを継承する他の Cache クラスもそれを直接使用できます。コードは次のとおりです<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">     /**      * 执行高级方法      * @param $method      * @param $parameters      * @return mixed      */     public function __call($method, $parameters)     {         return call_user_func_array(array($this-&gt;handler(), $method), $parameters);     }</pre><div class="contentsignin">ログイン後にコピー</div></div>テストコードを見てください<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?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-&gt;handler();         dump($redis-&gt;hSet('h_name', '2', 'jerry'));// int(1)     } }</pre><div class="contentsignin">ログイン後にコピー</div></div>この問題は解決されました。修正が終わった後、Laravel では

__call

を使っていたらしいことを思い出し、ソースコードを見てみると、確かにその通りでした。

ravel/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">     /**      * Pass methods onto the default Redis connection.      *      * @param  string  $method      * @param  array  $parameters      * @return mixed      */     public function __call($method, $parameters)     {         return $this-&gt;connection()-&gt;{$method}(...$parameters);     }</pre><div class="contentsignin">ログイン後にコピー</div></div>結論には次のコードがあります。実際、この小さな変更は実際的な意味以上に重要です。結局のところ、これはバグではなく、

handler

を使用して実現することもできます。私にとってより大きな意味があるのは、問題が発生したときに、ソース コードを確認する傾向が強まるということです。見れば見るほど、自然と能力が向上します。

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

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート