用php编写一个单例, 需要考虑几点:
1、对象不能new,将构造函数私有
2、对象不能继承,将类设置为final
3、对象不能克隆,将克隆方法私有
4、对象序列化,将wakeup私有
5、在内部做判断,如果已经实例化了对象,就直接返回。
应用场景: 适用于在整个程序的生命周期中都只有一个实例的对象。例如数据操作类、日志记录类
<?php
final class Singleton
{
private static $instance = null;
//禁止构造函数,避免外部new
private function __construct()
{}
//禁止克隆
private function __clone()
{}
//禁止序列化
private function __wakeup()
{}
//对外提供一个静态方法
public static function getInstance(): Singleton
{
if (self::$instance === null) {
//如果没有,则创建当前类的实例
self::$instance = new self();
}
//如果已经有了当前类实例,就直接返回,不要重复创建类实例
return self::$instance;
}
//other
}
$p1 = Singleton::getInstance();
$p2 = Singleton::getInstance();
var_dump($p1, $p2, $p1 === $p2);