php进阶学习-单例设计模式

什么是单例模式(singleton)?

在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点。

单例模式的特点

  1. 一个类只有一个实例
  2. 私有克隆函数和构造函数
  3. 有一个公共的"创建实例函数"供调用

单例模式的用处

单例模式一般也就是强调类的静态调用,一个进程对一个类的多次调用只产生一个类对象.由此,单例模式适用于类被多次调用但类的内容不变的场景

  1. 数据库连接
  2. 日志
  3. 在应用中锁定文件

实例场景

单例模式的数据库连接类

代码查看地址: Github

<?php
	/**
	 * 数据库连接单例类
	 */
	class Singleton {

		private $db_conn; //数据库连接

		private static $instance; //定义实例属性变量


		/**
	 	 * 私有化构造方法,防止直接实例化
	 	 */
		private function __construct($host, $username, $password, $database) {
			$this->db_conn = new mysqli($host, $username, $password, $database);
			if (!$this->db_conn) {
				die('数据库连接失败' . $this->db_conn->connect_error);
			}
		}

		/**
		 * 获取实例
		 * @param  [type] $host     [数据库地址]
		 * @param  [type] $username [数据库账号]
		 * @param  [type] $password [数据库密码]
		 * @param  [type] $database [数据库名]
		 * @return [type]           [实例]
		 */
		public static function getInstance($host, $username, $password,$database) {
			if (empty(self::$instance)) {
				self::$instance = new Singleton($host, $username, $password,$database);
			}

			return self::$instance;
		}

		/**
		 * 定义私有__clone方法,防止被克隆
		 * @return [type] [description]
		 */
		private function __clone() {}

		/**
		 * 数据库查询
		 * @param  [type] $sql [sql查询语句]
		 * @return [type]      [description]
		 */
		public function query($sql)
		{
			return $this->db_conn->query($sql);
		}

		/**
		 * 关闭数据库连接
		 * @return [type] [description]
		 */
		public function close()
		{
			return $this->db_conn->close();
		}

		/**
		 * 析构函数(关闭数据库连接)
		 */
		public function __destruct()
		{
			$this->close();
		}
	}

	//调用数据库连接单例类
	$sing_db = Singleton::getInstance('127.0.0.1', 'root', '123456', 'phper_advance');
	$res = $sing_db->query('select * from user');
	print_r($res->fetch_assoc());

posted @ 2020-11-03 09:13  coding在路上~  阅读(147)  评论(0编辑  收藏  举报