霞鞍蘑炉瑞忍蹭手饱轨冀戏咖
单例模式:一个类仅允许创建一个实例
例如:
1.一个站点仅连接一个数据库连接对象
2.一个站点仅允许存在一个配置类的实例对象
新建demo1.php
<?php class Config { /** * 必须先声明一个静态私有属性:用来保存当前类的实例 * 1. 为什么必须是静态的?因为静态成员属于类,并被类所有实例所共享 * 2. 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法 * 3. 为什么要有初始值null,因为类内部访问接口需要检测实例的状态,判断是否需要实例化 */ private static $instance = null; //保存用户的自定义设置 private $setting=[]; //构造器私有化,禁止从类外部实例化 //即不允许在外部通过new 类的时候调用构造方法初始化 private function __construct() { } //克隆方法私有化,禁止从类外部克隆对象 private function __clone() { } //创建一个当前类的一个实例,并且是唯一的实例 public static function getInstance() { //如果当前类的$instance为null 即实例化它 if(self::$instance==null) { self::$instance=new self(); } //如果已经有了当前类实例,就直接返回,不要重复创建类实例 return self::$instance; } //设置配置项 index:索引 public function set($index,$value) { $this->setting[$index]=$value; } //获取配置项 public function get($index) { return $this->setting[$index]; } } $config1=Config::getInstance(); $config2=Config::getInstance(); var_dump($config1); echo "<hr>"; var_dump($config2);
执行,创建的是同一个对象,符合单例模式的定义
<?php class Config { /** * 必须先声明一个静态私有属性:用来保存当前类的实例 * 1. 为什么必须是静态的?因为静态成员属于类,并被类所有实例所共享 * 2. 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法 * 3. 为什么要有初始值null,因为类内部访问接口需要检测实例的状态,判断是否需要实例化 */ private static $instance = null; //保存用户的自定义设置 private $setting=[]; //构造器私有化,禁止从类外部实例化 //即不允许在外部通过new 类的时候调用构造方法初始化 private function __construct() { } //克隆方法私有化,禁止从类外部克隆对象 private function __clone() { } //创建一个当前类的一个实例,并且是唯一的实例 public static function getInstance() { //如果当前类的$instance为null 即实例化它 if(self::$instance==null) { self::$instance=new self(); } //如果已经有了当前类实例,就直接返回,不要重复创建类实例 return self::$instance; } //设置配置项 index:索引 public function set($index,$value) { $this->setting[$index]=$value; } //获取配置项 public function get($index) { return $this->setting[$index]; } } $config=Config::getInstance(); $config->set('host','localhost'); echo $config->get('host');
执行:
蠢氦匡霜敲怜寒芯串冯椽秀肚