php写的一个简单的单例模式(多个版本)

在以下的示例中,我们首先定义了一个名为 Singleton 的类,其中包含一个私有静态变量 $instance,用于保存唯一的类实例。接着,我们定义了一个私有构造函数和一个私有克隆函数,以确保外部无法通过 new 和 clone 关键字创建多个实例。

以下是一个简单的 PHP 单例模式示例:

class Singleton {
    private static $instance = null;
    private function __construct() { }
    private function __clone() { }
    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
    public function showMessage() {
        echo "Hello, World!";
    }
}

我们通过 getInstance() 方法来获取 Singleton 类的实例。在 getInstance() 方法中,如果 $instance 为空,则创建一个新的 Singleton 实例并将其赋值给 $instance。否则,直接返回现有的 $instance 实例。这样可以确保整个应用程序中只有一个 Singleton 类的实例。

最后,我们在 Singleton 类中定义了一个名为 showMessage() 的方法,用于输出“Hello, World!”的信息。

在使用 Singleton 类时,可以通过以下方式获取其唯一实例并调用 showMessage() 方法:

$singleton = Singleton::getInstance();
$singleton->showMessage();

如果我们想要让 Singleton 类支持懒加载,即在需要时才创建 Singleton 实例,可以使用如下的改进:

class Singleton {
    private static $instance = null;
    private function __construct() { }
    private function __clone() { }
    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    public function showMessage() {
        echo "Hello, World!";
    }
}

在这个版本中,我们使用了 self() 代替了类名 Singleton。这样,如果我们在未来修改类名,getInstance() 方法仍然可以正确创建实例。

另外,我们也可以使用 PHP 5.3 引入的匿名函数和闭包实现懒加载,如下所示:

class Singleton {
    private static $instance = null;
    private function __construct() { }
    private function __clone() { }
    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = call_user_func(function() {
                return new self();
            });
        }
        return self::$instance;
    }
    public function showMessage() {
        echo "Hello, World!";
    }
}

在这个版本中,我们使用了一个匿名函数和闭包来实现懒加载。在 getInstance() 方法中,如果 $instance 为空,则通过 call_user_func() 调用一个返回 Singleton 实例的匿名函数,并将其赋值给 $instance。这样可以确保只有在需要时才创建 Singleton 实例。

猜你喜欢:

php单例模式实现流程

php单例模式和工厂模式的区别