thinkphp5中__destruct何时执行?

查看:161
本文介绍了thinkphp5中__destruct何时执行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

<?php
namespace app\shop\drive;
class Redis {
    public $handler;
    public function __construct(){
        $redis = new \Redis();
        $redisConf = config('cache.redis');
        $redis->connect($redisConf['host'], $redisConf['port']);
        $redis->auth($redisConf['password']);
        $this->handler = $redis;
    }

    public function __destruct(){
        $this->handler->close();
    }
}

控制器中

    ...
    public $redis, $prefix;
    protected function _initialize(){
        $this->initRedis();
        var_dump($this->redis->info()); //出错,redis连接已关闭
    }
    private function initRedis()
    {
        $redis = new Redis;
        $this->redis = $redis->handler;
        var_dump($this->redis->info()); //正常
        $this->prefix = config('cache.redis')['prefix'];
    }

1、这是啥原因?
2、有必要手动关闭redis连接吗?

解决方案

__destruct()方法是当对象被销毁时执行

public $redis, $prefix;
    protected function _initialize(){
        $this->initRedis();    //在initRedis()方法中实例Redis对象,当此方法执行完毕,实例出来的Redis对象就会被销毁,同时会执行Redis类中的__destruct方法,redis连接被关闭
        var_dump($this->redis->info()); //此时initRedis已经执行完毕,redis连接也已经被关闭
    }
    private function initRedis()
    {
        $redis = new Redis;
        $this->redis = $redis->handler;
        var_dump($this->redis->info()); //正常
        $this->prefix = config('cache.redis')['prefix'];
    }

php中,函数或方法执行完毕,其内部的变量在其执行完毕后都会被销毁(静态变量除外),因此,在initRedis执行完毕后会销毁$redis变量,此时会执行Redis类中的__destruct()方法,哪怕你把handle赋给了redis属性,但是redis连接已经在__destruct()中关闭了

这篇关于thinkphp5中__destruct何时执行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆