Dieser Artikel bietet Ihnen eine Einführung in die Methode zum Ändern des Cache-Quellcodes in ThinkPHP 5.1. Ich hoffe, dass er für Freunde hilfreich ist.
Ich lerne kürzlich THinkPHP 5.1 und nachdem ich die Funktionsweise der Cache-Methode gesehen habe, bin ich etwas verwirrt. Obwohl es viele Methoden kapselt und sehr benutzerfreundlich ist, scheint es für fortgeschrittene Operationen von Redis nicht sehr benutzerfreundlich zu sein. Zu Lernzwecken wurde der Quellcode leicht geändert. Lassen Sie mich zunächst zwei Punkte ansprechen: Erstens ist diese Änderung nur eine persönliche Meinung und nicht für jedermann geeignet. Zweitens dient diese Änderung nur zum Lernen. Bitte seien Sie vorsichtig, wenn Sie den Quellcode ändern.
Problem
Beim Üben von Redis habe ich festgestellt, dass Sie zuerst das Handle zurückgeben müssen, wenn Sie erweiterte Methoden wie hSet, hGet usw. verwenden möchten es ausführen. Wie Sie unten
<?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) } }
sehen können, war die Ausführung erfolgreich. Die Frage ist, warum das Handle zuerst zurückgegeben werden soll, was mit der magischen Methode von __call gelöst werden kann.
Verfolgen Sie den Quellcode
Da Sie Zweifel haben, müssen Sie diese klären. Als ich den Quellcode verfolgte, sah ich thinkphp/library/think/cache/Driver.php und stellte fest, dass es tatsächlich keinen __call gab, sondern nur einen Handler, der das Handle zurückgab, um erweiterte Methoden auszuführen. Ich verstehe nicht, warum __clss nicht verwendet wird.
Das Problem lösen
Die Lösung besteht darin, die __call-Methode in thinkphp/library/think/cache/Driver.php hinzuzufügen, damit nicht nur Redis Advanced verwenden kann Methoden direkt, aber auch andere Cache-Klassen, die diese Datei erben, können direkt verwendet werden. Der Code lautet wie folgt
/** * 执行高级方法 * @param $method * @param $parameters * @return mixed */ public function __call($method, $parameters) { return call_user_func_array(array($this->handler(), $method), $parameters); }
Sehen Sie sich den Testcode noch einmal an
<?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) } }
Dieses Problem wurde gelöst. Als ich mit der Änderung fertig war, fiel mir ein, dass Laravel anscheinend __call verwendet, und dann schaute ich mir den Quellcode an, und das war tatsächlich der Fall. Es gibt den folgenden Code in 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); }
Fazit
Tatsächlich die symbolische Bedeutung von Diese kleine Änderung ist von größerer praktischer Bedeutung, schließlich ist dies kein Fehler, sondern kann auch mit dem Handler erreicht werden. Die größere Bedeutung für mich besteht darin, dass ich bei Problemen eher dazu geneigt bin, den Quellcode zu überprüfen. Je mehr Sie zuschauen, desto besser werden Ihre Fähigkeiten.
Das obige ist der detaillierte Inhalt vonEinführung in die Methode zum Ändern des Cache-Quellcodes in ThinkPHP 5.1 (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!