单例模式(Singleton Pattern):顾名思义,就是只有一个实例。作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
为什么要使用单例模式
1、PHP语言本身的局限性
PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和ASP.NET、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。
2、应用场景
一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。
如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现.
要点
一个类只能有一个对象
必须是自行创建这个类的对象
要想整个系统提供这一个对象
具体实现的重点
必须拥有一个访问级别为 private 的构造函数,有效防止类被随意实例化。
必须拥有一个保存类的实例的静态变量。
必须拥有一个访问这个实例的公共的静态方法,该方法通常被命名为 GetInstance()。
必须拥有一个私有的空的__clone方法,防止实例被克隆复制。
代码实现
<?php
class SingleClass{
// 存放实例 私有静态变量
private static $_instance = null;
// 私有化构造方法、
private function __construct(){
echo "单例模式的实例被构造了";
}
// 私有化克隆方法
private function __clone(){
}
// 公有化获取实例方法
public static function getInstance(){
if (!(self::$_instance instanceof SingleClass)){
self::$_instance = new SingleClass();
}
return self::$_instance;
}
}
$SingleClass = SingleClass::getInstance();
文章评论