单例指某一个类只存在一个实例,只实例化一次,不需要每次都去new,降低资源的耗费,比如数据库的连接类。
4私1公结构
1、将__construct私有,对象不能new
2、将__clone方法私有,禁止克隆实例
3、将__wakeup私有对象不能序列化,
4、私有化static属性:防止直接访问存储实列的属性
5、公有的静态方法(对外界提供实例)
6、对象不能继承,将类设置为final
7、在内部做判断,如果已经实例化了对象,就直接返回。
应用场景: 适用于在整个程序的生命周期中都只有一个实例的对象。例如数据操作类、日志记录类
final class Singleton
{
//静态私有变量保存该类对象
private static $instance = null;
//禁止new直接创建对象
private function __construct()
{
echo '实例化一次';
}
//防止对象被复制
private function __clone()
{}
//防止反序列化后创建对象
public function __wakeup()
{
trigger_error('Unserialize is not allowed!');
}
//对外提供一个静态方法,构造函数私有化后只能用静态函数与变量
public static function getInstance(): Singleton
{
if (self::$instance === null) {
//如果没有,则创建当前类的实例
self::$instance = new self();
}
//如果已经有了当前类实例,就直接返回,不要重复创建类实例
return self::$instance;
}
}
$p1 = Singleton::getInstance();
echo '//<br>';
$p2 = Singleton::getInstance();
var_dump($p1, $p2, $p1 === $p2);
看,结果句柄是一样的:
实例化一次//
object(Singleton)#1 (0) { } object(Singleton)#1 (0) { } bool(true)