php Serialize Unserialize - yaokun123/php-wiki GitHub Wiki

我们经常采用如下方式定义单列:

class Singleton {
    private static $instance = NULL;
    /** 不容许直接调用构造函数 */
    private function __construct() {
    }
    /** 不容许深度复制 */
    private function __clone() {
    }
    public static function getInstance() {
        if (NULL === self::$instance) {
             self::$instance = new self();
          }
        return self::$instance;
    }
}

很多人都会记得对深度copy的保护, 但, 其实我们却疏忽了一点:

<?php
$a = Singleton::getInstance();
$b = unserialize(serialize($a));
var_dump($a === $b);
//bool(false)

呵呵, 可见还需要修补, 加上对序列化的保护:

class Singleton {
    private static $instance = NULL;
    /** 不容许直接调用构造函数 */
    private function __construct() {
    }
    /** 不容许深度复制 */
    private function __clone() {
    }
    /** 不容许serialize */
    private function __sleep() {
    }
    /** 不容许unserialize */
    private  function __wakeup() {
    }
    public static function getInstance() {
        if (NULL === self::$instance) {
             self::$instance = new self();
          }
        return self::$instance;
    }
}