thinkphp5中__destruct何時執行?
世界只因有你
世界只因有你 2017-05-16 13:11:43
0
1
443
<?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連線嗎?

世界只因有你
世界只因有你

全部回覆(1)
巴扎黑

__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()中關閉了

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板