1. 单例模式含义
单例模式就是一个类只有一个实例,不能外部实例化,并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
2. 为何要使用PHP单例模式?
PHP每次执行完,返回数据后,会从内存中清理掉所有的资源. 所以PHP中的单例模式实际每次运行都是需重新实例化, php单例模式适合使用在整个运行过程中需要多次对某一操作类进行多次new的场景。
注: 每实例化一次就会在堆内存中复制一份代码段
<?php
class {
function __consruct(){
}
}
$Aobj = new A();
$Bobj = new A();
if($Aobj === $Bobj){
echo '对象相等','<br>';
}else{
echo '对象不相等','<br>';
}
echo '<pre>';
var_dump($Aobj);
var_dump($Bobj);
打印如下输出
3. 创建一个PHP单例其实只需要掌握以下四点:
- 定义静态变量,存放该类实例化的唯一对象
- 定义私有构造方法,防止类外部new创建对象
- 定义公共的静态方法来获取该对象,供类外部使用
- 定义个私有的克隆方法,禁止该对象被克隆
注: php的static变量只针对一次请求,php文件执行完毕,该static变量也随机消亡,再次请求(再次执行该php文件),会重新创建该static变量。
4. 单例模式使用场景:
- 数据库应用, 一个应用中会频繁进行数据库操作, 如使用单例模式, 则可以避免大量的new 操作,避免过多的消耗系统资源。
- 配置资源的共享,用单例模式也可以减少每次去读取配置带来的内存和系统资源的消耗
- 可以在单例模式类中,集中处理,设置钩子,日志输出等提高代码可维护性
5. 使用示例
5.1. redis使用示例
<?php
class RedisModel{
# 私有静态 变量存储被实例化的对象
private static $obj=null;
#禁止外部实例化
private function __construct(){
self::$obj = new \Redis();
self::$obj->connect('127.0.0.1','6379');
}
#外部调用创建该类的实例
public static function create(){
if(self::$obj === null) new RedisModel();
return self::$obj;
}
# 禁止克隆该对象
private function __clone(){}
}
$redisModelA = RedisModel::create();
$redisModelB = RedisModel::create();
if($redisModelB ===$redisModelA){
echo '相等','<br>';
}else{
echo '不相等','<br>';
}
$redisModelB->set('name','张三');
echo $redisModelB->get('name');
# 2. 报错说明已经禁止外部实例
$redisModelC = new RedisModel();
var_dump($redisModelC);