php单例模式实现(对象只被创建一次)


在PHP中,单例模式是一种常用的设计模式,用于确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。以下是使用PHP实现单例模式的一个基本示例:


<?php
class Singleton {
    // 存储类的唯一实例
    private static $instance = null;

    // 私有构造函数,防止外部通过new创建对象
    private function __construct() {
    }

    // 私有克隆方法,防止克隆对象
    private function __clone() {
    }

    // 私有反序列化方法,防止反序列化对象
    private function __wakeup() {
    }

    // 静态方法,用于获取类的唯一实例
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    // 可以添加其他公共方法
    public function doSomething() {
        echo "Doing something...\n";
    }
}

// 使用单例
$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();

// 检查是否为同一个实例
if ($instance1 === $instance2) {
    echo "They are the same instance.\n";
}

$instance1->doSomething();
?>

在这个例子中,`Singleton`类通过私有构造函数`__construct`防止了通过`new`关键字在类的外部创建实例。`getInstance`方法用于检查是否已经创建了类的实例,如果没有,则创建一个新的实例,并将其存储在静态变量`$instance`中。如果已经创建了实例,则直接返回该实例。此外,通过私有方法`__clone`和`__wakeup`防止了克隆和反序列化对象,从而确保类的实例在整个应用程序的生命周期中只被创建一次。

请注意,虽然PHP的`__wakeup()`方法在反序列化时调用,但在这个单例模式实现中,我们将其设为私有方法并留空,以防止通过反序列化创建额外的实例。然而,最佳实践是确保对象不可序列化(例如,通过实现`__sleep()`方法抛出异常),除非确实需要这样做。不过,由于这个示例专注于单例模式的实现,因此没有包括这一点。