问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

自己用thinkphp做微信接口类文件,遇一个问题,GET获取到的token,如何将...

发布网友 发布时间:2022-04-24 19:26

我来回答

3个回答

懂视网 时间:2022-04-06 05:00

在之前的文章中我们简单的梳理了一下容器类,接下来就是对其中一个细节进行深度分析。

Container实例调用make方法

本文没有太多文字解析,都在代码注释中说明了执行过程。

代码static::getInstance()返回了Container的实例后,就会去调用本类的make方法,接下来就是对make方法进行详解了。

在开始阅读make方法里边的源码之前,我们需要先对几个属性进行简单的梳理一下。

这四个属性一定要有点印象,并且一定要区别instance和instances。

这俩个属性一个是单例模式返回当前类的实例,一个是容器中的所有的实例。

第一次执行结果

 /**
* 创建类的实例
* @access public
* @param string $abstract 类名或者标识
* @param array|true $vars 变量
* @param bool $newInstance 是否每次创建新的实例
* @return object
*/
public function make($abstract, $vars = [], $newInstance = false)
{
// 判断$vars这个变量是否为true
if (true === $vars) {
// 总是创建新的实例化对象
$newInstance = true;
$vars = [];
}

// app 这里就是在容器别名里获取传递过来的app 如果没有则就是app
$abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract;

// 从容器实例中获取 如果存在则直接返回对应的实例 也就是使用注册树模式
if (isset($this->instances[$abstract]) && !$newInstance) {
return $this->instances[$abstract];
}

// thinkApp 从容器标识中获取
if (isset($this->bind[$abstract])) {
// 将thinkApp 复制给$concrete变量
$concrete = $this->bind[$abstract];
// 用于代表匿名函数的类 判断是不是闭包
if ($concrete instanceof Closure) {
$object = $this->invokeFunction($concrete, $vars);
} else {
// $this->name['app'] = thinkApp
$this->name[$abstract] = $concrete;
// 在执行一次本类的make方法,也就是本方法
return $this->make($concrete, $vars, $newInstance);
}
} else {
$object = $this->invokeClass($abstract, $vars);
}

if (!$newInstance) {
$this->instances[$abstract] = $object;
}

return $object;
}

这是第二次执行流程

 public function make($abstract, $vars = [], $newInstance = false)
{
// 判断$vars这个变量是否为true
if (true === $vars) {
// 总是创建新的实例化对象
$newInstance = true;
$vars = [];
}

// app 这里就是在容器别名里获取传递过来的app 如果没有则就是app
// 第二次执行时 $abstract = thinkApp
$abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract;

// 从容器实例中获取 如果存在则直接返回对应的实例 也就是使用注册树模式
if (isset($this->instances[$abstract]) && !$newInstance) {
return $this->instances[$abstract];
}

// thinkApp 从容器标识中获取
// 第二次执行$this->bind['thinkApp']不存在走else
if (isset($this->bind[$abstract])) {
// 将thinkApp 复制给$concrete变量
$concrete = $this->bind[$abstract];
// 用于代表匿名函数的类 判断是不是闭包
if ($concrete instanceof Closure) {
$object = $this->invokeFunction($concrete, $vars);
} else {
// $this->name['app'] = thinkApp
$this->name[$abstract] = $concrete;
// 在执行一次本类的make方法,也就是本方法
// thinkApp
return $this->make($concrete, $vars, $newInstance);
}
} else {
// thinkApp
$object = $this->invokeClass($abstract, $vars);
}

if (!$newInstance) {
// 把创建的容器存起来
//$this->instances['thinkApp'] = $object;
$this->instances[$abstract] = $object;
}

return $object;
}
public function invokeClass($class, $vars = [])
{
try {

/**
* ReflectionClass Object
(
[name] => thinkApp
)
*/
// 这里就是之前文章提到的反射
$reflect = new ReflectionClass($class);


if ($reflect->hasMethod('__make')) {
$method = new ReflectionMethod($class, '__make');

if ($method->isPublic() && $method->isStatic()) {
$args = $this->bindParams($method, $vars);
return $method->invokeArgs(null, $args);
}
}
// 通过反射获取thinkApp的构造函数
$constructor = $reflect->getConstructor();

$args = $constructor ? $this->bindParams($constructor, $vars) : [];
// 从给出的参数创建一个新的类实例
return $reflect->newInstanceArgs($args);

} catch (ReflectionException $e) {
throw new ClassNotFoundException('class not exists: ' . $class, $class);
}
}

执行流程图

既然把代码都理清楚了,这时来理一下执行的流程图可以看的更清晰。

坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。

热心网友 时间:2022-04-06 02:08

class IndexAction extends Action {

    public function index() {
        $token = D("wx_token")->field("add_ip", true)->select();
        foreach ($token as $key => $v) {
            if ($v['expire_time'] - 300 < time()) {
                $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$v['appid']}&secret={$v['secret']}";
                $res = file_get_contents($url, false);
                $this->getAccessToken($v['id'], $res);

            }else{
                $date = date("Y-m-d H:i:s") ;
                echo "{$date}_____no expire\r\n" ;
            }
        }
    }

    private function getAccessToken($token, $res) {
        $sign = false ;
        $json = json_decode($res);
        $data['id'] = $token;
        $data['access_token'] = $json->access_token;
        $data['expire_time'] = time() + 7200;
        $data['add_time'] = time();
        $data['add_ip'] = '127.0.0.1' ;
        $db = D("wx_token");
        $db->startTrans();
        if ( $db->save($data)){
            $db->commit() ;
            $sign = true ;
        }else{
            $db->rollback() ;
            $sign = false ;
        }
        return $sign ;
    }

}

再创建个数据表,保存就好了,整个定时任务,定时去获取比较好。

热心网友 时间:2022-04-06 03:26

写成一个配置文件就可以了,或者单独用一个文件来存储
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你家的水龙头起泡器该换了 如何打开水龙头起泡器 网上卖门锁,安装如何解决 广告装潢需要哪些设备 广告制作需要哪些材料 开锦旗招牌广告制做店须要什么 广告店需要哪些耗材 长安之星发动机水泵要坏之前声音怎么判断 家有孕妇咋调理:280天贴心呵护生健康宝贝图书信息 哪些是适合孕妇看的书 部分机型支付成功后不跳转 如何调试? 王学兵第三任娇妻是谁? phpthinkphp写一个微信支付功能多少钱 曾出演了很多电视剧,为什么王学兵后来不火了? thinkphp 5.0 是否加入 微信和支付宝的功能 电影《一个勺子》王学兵扮演的什么角色?王学兵还有哪些作品? thinkphp 微信支付 --- 当前页面的URL未注册? 徐静蕾曾经与多位男性传过绯闻,但真正的初恋男友是王学兵,这是真的吗? 他是除李晨之外,范冰冰唯一公开过的男友,曾有过五段恋情,他是谁? 微信扫码支付怎么嵌入到thinkphp 王学兵娶三个老婆越娶越嫩,娶小15岁爱妻,儿子都4岁了,现在他怎么样? thinkphp微信h5支付sdk怎么用 王学兵被朋友戏称为“王工程师”,他究竟掌握着怎样的技术? 王学兵的介绍 王学兵吸毒已被放出,和他同时被抓的吸毒演员现在怎样了? 王学兵的人物争议 曾经是范冰冰男友,实力派演员,如今沦为路人甲,他是谁? 王学兵吸毒被抓是真的吗? 从大众女婿到劣迹艺人,最近又拿奖,王学兵这些年是怎么过来的? 王学兵的个人生活 thinkphp5网站 微信授权登录 code得到没问题,但就是提示get_file_conte... 微信开发,在支付的时候提示当前url未注册,是不是因为回调的域名没有备案? thinkphp微信二维码相同订单怎么不生成 请举一个使用账户支付的例子,说明其支付流程,并指出可能存在支付风险的环节。 方舒现在有老公吗 陈国星现任和方舒对比照,当年的女神做的选择错了吗? 方舒为屠洪刚抛弃糟糠夫,和前夫女儿比异父妹妹优秀,后来怎样? 屠洪刚第二任妻子方舒照片 80年代的方舒属于一级美,放在现在她的颜被喜欢吗? 不惜和现任丈夫离婚,也要嫁小十岁屠洪刚的方舒,如今怎么样了? 为爱嫁小10岁歌手,惨遭抛弃的方舒如今怎样了? 头婚抛弃陈国星,二婚嫁小10岁屠洪刚,方舒如今怎样了? 春晚第一位英语主持人方舒,2婚嫁屠洪刚如今怎么样? 方舒:为了小10岁男友抛弃糟糠之夫,如今怎样了? 她曾经也是女神,竟然遭小10岁渣男抛弃,晚年的生活如此凄凉,你怎么看? 为小10岁的屠洪刚和前夫离婚,面对晚年的孤独,方舒有没有后悔过? 关于文件夹选项下面文件类型标签里的问题 她在《他们在相爱》中与达式常演恋人,美貌与实力并存,近况如何? 怎样看文件夹类型 魔兽世界纳格兰有个跳床的任务该怎么做?