搜索

首页  >  问答  >  正文

thinkphp5中__destruct何时执行?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code><?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();

    }

}</code>

控制器中

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>    ...

    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'];

    }</code>

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

世界只因有你世界只因有你2866 天前481

全部回复(1)我来回复

  • 巴扎黑

    巴扎黑2017-05-16 13:13:43

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    <code>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'];

        }</code>

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

    回复
    0
  • 取消回复