PHP设计模式之单例模式

前言

PHP设计模式多达23种,但常用的就几种,今天就介绍一下其中常用的。

常用的设计模式有三种:单例模式、工厂模式(普通工厂、抽象工厂)

什么叫单例模式

单例模式:创建类的唯一实例

为什么要使用单例模式

1.一个php数据库对外连接是有限的,一般一千个。一个应用中会存在大量的数据库操作,在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源(我所了解的)

简单来说就是可以只创建一次数据库连接实例

2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend framework的FrontController部分。

3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

如何创建单例

为了防止在类外实例化多个对象

1.构造方法私有化

2.防止克隆对象,私有化克隆方法

3.提供内部实例化

 1 namespace demo1;
 2 
 3 class Demo{
 4     // 1.私有化构造方法
 5     private function __construct(){
 6 
 7     }
 8 
 9     // 2.提供内部实例化
10     private static $instance = null;
11     public static function getInstance(){
12         if(is_null(self::$instance)){
13             self::$instance =new self();
14         }
15         return $instance;
16     }
17 
18     // 3.防止克隆对象,私有化克隆化方法
19     private function __clone(){}
20     }
21 }
22 
23 //获取当前唯一实例
24 $demo1 = Demo::getInstance();

实用场景(数据库连接单例模式)

namespace Demo2;

class Db{
    // 1.实例化构造方法
    private function __construct(...$connectParams){
        list($dsn,$username,$password) = $connectParams;
        self::$pdo = new \PDO($dsn,$username,$password);
    }

    // 2.内部实例化
    private static $pdo = null;
    public static function getInstance(...$connectParams){
        if(is_null(self::$pdo)){
           new self(...$connectParams);
        }
        return self::$pdo;
    }

    // 3.防止克隆
    private function __clone(){}
}

// 实例化
$connectParams = ['mysql:host=localhost;dbname=php_test','root','root'];
$pdo=Db::getInstance(...$connectParams);
$pdo1=Db::getInstance(...$connectParams);
// 验证
var_dump($pdo === $pdo1);

 

posted @ 2020-11-16 13:58  键盘苦力  阅读(161)  评论(0)    收藏  举报