Heim >PHP-Framework >Denken Sie an PHP >Ausführliche Erklärung zum Ändern des Cache-Quellcodes in ThinkPHP 5.1

Ausführliche Erklärung zum Ändern des Cache-Quellcodes in ThinkPHP 5.1

藏色散人
藏色散人nach vorne
2021-03-12 11:37:241921Durchsuche

In der folgenden Tutorial-Kolumne von thinkphp erfahren Sie ausführlich, wie Sie den Cache-Quellcode von ThinkPHP 5.1 ändern. Ich hoffe, dass es für Freunde in Not hilfreich ist!

Ausführliche Erklärung zum Ändern des Cache-Quellcodes in ThinkPHP 5.1

ThinkPHP 5.1 Cache-Quellcode ändern

Einführung

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 bequem zu verwenden ist, scheint es für fortgeschrittene Operationen von Redis nicht sehr geeignet zu sein. Zu Lernzwecken wurde der Quellcode leicht geändert. Zunächst möchte ich zwei Punkte anmerken: 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. Frage

Beim Üben von Redis habe ich festgestellt, dass Sie, wenn Sie erweiterte Methoden wie hSet, hGet usw. verwenden möchten, zuerst das Handle zurückgeben müssen ausführen. Wie Sie unten sehen können

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

, 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. 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

Verfolgen Sie den Quellcode
🎜Da Sie Zweifel haben, müssen Sie diese klären. Nachdem ich den Quellcode verfolgt hatte, sah ich thinkphp/library/think/cache/Driver.php und stellte fest, dass es tatsächlich keinen __call gab, sondern nur handler um das Handle zurückzugeben. Erweiterte Methoden ausführen. Ich verstehe nicht, warum __clss nicht verwendet wird. 🎜🎜Lösung des Problems🎜🎜Die Lösung besteht darin, die Methode __call 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🎜rrreee🎜Schauen Sie sich den Testcode noch einmal an🎜rrreee🎜Dieses Problem wurde gelöst. Als ich mit der Änderung fertig war, fiel mir ein, dass Laravel __call zu verwenden schien, 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🎜rrreee🎜Fazit🎜🎜Tatsächlich ist die symbolische Bedeutung dieser kleinen Änderung größer als die Tatsächliche Bedeutung. Dies ist schließlich nicht der Fall. Mit handler können Fehler behoben 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 vonAusführliche Erklärung zum Ändern des Cache-Quellcodes in ThinkPHP 5.1. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen