单例模式

  1. 概念

    是一种类的设计只会最多产生一个对象的设计思想

  2. 作用

    • php的应用主要在于数据库应用,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量的new操作消耗的资源。
    • 如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现。
    • 再一次页面请求中,便于进行调试,因为所有的代码都会集中在一个类里面,我们可以在类中设置钩子,输出日志,从而避免到处var_dump,echo。
  3. 应用场景

    数据库连接,缓存操作,分布式储存

  4. 单例模式的要点

    • 构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化。
    • 拥有一个保存类的实例的静态成员变量。
    • 拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)
    • 简称 三私一公:
      • 私有化构造方法:不让在外部产生多个对象
      • 私有化克隆方法:不允许对象被克隆产生新对象
      • 私有化静态属性:运行进入类内部产生对象
      • 公有化静态方法:保存已经产生的对象
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
    //单例
    class Uni{
    //创建静态私有的变量保存该类对象
    static private $instance;
    //参数
    private $config;
    //防止直接创建对象
    private function __construct($config){
    $this -> config = $config;
    echo "我被实例化了";
    }
    //防止克隆对象
    private function __clone(){

    }
    static public function getInstance($config){
    //判断$instance是否是Uni的对象
    //没有则创建
    if (!self::$instance instanceof self) {
    self::$instance = new self($config);
    }
    return self::$instance;

    }
    public function getName(){
    echo $this -> config;
    }
    }
    $db1 = Uni::getInstance(1);
    $db1 -> getName();
    echo "<br>";
    $db2 = Uni::getInstance(4);
    $db2 -> getName();

    /**
    *运行结果:
    *我被实例化了1
    *1

    *$db1创建对象后,参数是1
    *$db2没有创建对象,而是直接使用$instance保存的唯一对象,所以输出的参数并没有变为4;
    */