Представил
Недавно, изучая ThinkPHP 5.1, я увидел работу метода кэширования и был немного сбит с толку. Хотя многие методы инкапсулированы и используются удобно, расширенная работа Redis кажется не очень дружественной. В целях обучения исходный код был слегка изменен. Прежде всего, я заявляю о двух моментах: во-первых, эта поправка является только личной точкой зрения, не подходит для всех; во-вторых, эта поправка предназначена только для обучения, вы осторожны. Изменить исходный код 。
проблема
Практикуя Redis, вы обнаруживаете, что если вы хотите использовать расширенные методы, такие как hSet
、 hGet
Wait, вам нужно вернуться к дескриптору, прежде чем вы сможете его выполнить. следующим образом
Как видите, казнь прошла успешно. Вопрос в том, почему вы хотите сначала вернуть дескриптор, и вы можете использовать его __вызов
Это волшебное решение.
Отслеживание исходного кода
Теперь, когда есть сомнения, нам нужно их разрешить. Отследите исходный код, см. thinkphp/library/think/cache/Driver.php
Нет, я узнал. __вызов
Просто обработчик
Для возврата дескриптора для выполнения расширенного метода. Я не знаю, почему это не работает. __класс
。
Решите проблему
Решение состоит в том, чтобы thinkphp/library/think/cache/Driver.php
Добавьте __вызов
метода, чтобы не только Redis мог напрямую использовать расширенные методы, но и другие классы кэша, наследующие этот файл, могли использовать их напрямую. Код выглядит следующим образом
/** * Executing advanced methods * @param $method * @param $parameters * @return mixed */ public function __call($method, $parameters) { return call_user_func_array(array($this->handler(), $method), $parameters); }
Посмотрите на тестовый код еще раз
handler(); dump($redis->hSet('h_name', '2', 'jerry'));// int(1) } }
Проблема была решена. Когда я закончил, мне показалось, что Ларавель работает. __звонок
А потом я посмотрел на исходный код, и это правда. останься 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, Laravel redis, call_user_func_array.