1. 概念

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

  2. 作用

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

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

  4. 单例模式的要点

    • 构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化。
    • 拥有一个保存类的实例的静态成员变量。
    • 拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)
    • 简称 三私一公:
      • 私有化构造方法:不让在外部产生多个对象
      • 私有化克隆方法:不允许对象被克隆产生新对象
      • 私有化静态属性:运行进入类内部产生对象
      • 公有化静态方法:保存已经产生的对象
    <?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;
    */