Maison > développement back-end > tutoriel php > Introduction à la méthode de modification du code source du Cache dans ThinkPHP 5.1 (exemple de code)

Introduction à la méthode de modification du code source du Cache dans ThinkPHP 5.1 (exemple de code)

不言
Libérer: 2023-04-05 06:42:02
avant
2364 Les gens l'ont consulté

Cet article vous présente la méthode de modification du code source du Cache dans ThinkPHP 5.1 (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

J'apprends THinkPHP 5.1 récemment, et après avoir vu le fonctionnement de la méthode Cache, je suis un peu confus. Bien qu'il encapsule de nombreuses méthodes et soit très pratique à utiliser, il ne semble pas très convivial pour les opérations avancées de Redis. À des fins d'apprentissage, le code source a été légèrement modifié. Tout d'abord, permettez-moi de souligner deux points : premièrement, cette modification n'est qu'une opinion personnelle et ne convient pas à tout le monde ; deuxièmement, cette modification est uniquement destinée à l'apprentissage, veuillez être prudent lorsque vous modifiez le code source.

Problème

En pratiquant Redis, j'ai découvert que si vous souhaitez utiliser des méthodes avancées, telles que hSet, hGet, etc., vous devez d'abord renvoyer le handle avant l'exécuter. Comme indiqué ci-dessous

<?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)
    }
}
Copier après la connexion

vous pouvez voir que l'exécution a réussi. La question est de savoir pourquoi le handle doit être renvoyé en premier, ce qui peut être résolu avec la méthode magique de __call.

Tracez le code source

Puisque vous avez des doutes, vous devez les dissiper. En traçant le code source, j'ai vu thinkphp/library/think/cache/Driver.php et j'ai découvert qu'il n'y avait effectivement pas d'appel __, juste un gestionnaire pour renvoyer le handle pour exécuter des méthodes avancées. Je ne comprends pas pourquoi __clss n'est pas utilisé.

Résoudre le problème

La solution est d'ajouter la méthode __call dans thinkphp/library/think/cache/Driver.php, afin que Redis puisse non seulement utiliser les fonctions avancées directement les méthodes, mais également d'autres classes Cache qui héritent de ce fichier peuvent être utilisées directement. Le code est le suivant

     /**
     * 执行高级方法
     * @param $method
     * @param $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        return call_user_func_array(array($this->handler(), $method), $parameters);
    }
Copier après la connexion

Regardez à nouveau le code de test

<?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)
    }
}
Copier après la connexion

Ce problème a été résolu. Quand j'ai terminé la modification, je me suis souvenu que Laravel semblait utiliser __call, puis j'ai regardé le code source, et c'était effectivement le cas. Il y a le code suivant dans 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);
    }
Copier après la connexion

Conclusion

En fait, c'est une petite modification La signification symbolique est plus grande que la signification réelle. Après tout, ce n'est pas un bug et peut être obtenu en utilisant handler. Le plus important pour moi est que lorsque je rencontre des problèmes, je serai plus enclin à vérifier le code source. Plus vous regardez, vos capacités s’amélioreront naturellement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal