PHP单例模式及应用场
设计模式?听起来很高大上?的确是这样的。设计模式就是组织代码的方式,也就是说代码不再是一条条的往下执行,按照前人总结的行之有效的方法,更有效的来组织代码,这样效率更高,而且看起来也清晰有序。
php单例模式,起初不是很熟悉,是在看MVC框架源代码的时候才注意到的,设计模式在框架的设计应用中很广泛,因此框架的代码更有序高效。
单例模式顾名思义,就是只有一个实例。作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称为单例类。
单例模式有三个特点:
1.某个类只能有一个实例。
2.这个类必须自己创建这个实例。
3.这个类必须自行向系统提供这个实例。
为什幺使用"单例模式"?
先看一段代码:(这是一个数据库连接类)
<?php
class Mysql
{
// MYSQL数据库连接信息
const HOSTNAME = "127.0.0.1";
const USERNAME = "root";
const PASSWORD = "***";
const DBNAME = "test";
const CHARSET = "utf8"; public function MysqlConnect()
{
$db = new mysqli(self::HOSTNAME, self::USERNAEM, self::PASSWORD, self::DBNAME); // 连接数据库
$db->query("set names ".self::CHARSET);
if (mysqli_connect_errno())
{
throw new MysqlException("服务器系统故障", 1001);
}
else
{
return $db;
}
}
}
?>
每次数据库连接都要new这个类,然后调用mysqlconnect方法,返回连接,然后close掉连接,频繁的new和数据库连接关闭操作非常的消耗资源!数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
因此,为了避免资源消耗,我们有了下面的改进:
<?php
class Mysql{
//该属性用来保存实例
private static $conn;
//构造函数为private,防止创建对象
private function __construct(){
$this->conn = mysql_connect('localhost','root','');
}
//创建一个用来实例化对象的方法
public static function getInstance(){
if(!(self::$conn instanceof self)){
self::$conn = new self;
}
return self::$conn;
}
//防止对象被复制
public function __clone(){
trigger_error('Clone is not allowed !');
} }
//只能这样取得实例,不能new 和 clone
$mysql = Mysql::getInstance();
?>
这样就不用每次都来new这个类了,方便了很多。下面给一个详细的:
<?php
class Mysql
{
private $DB;
static private $_instance;
// 连接数据库
private function __construct($host, $username, $password)
{
$this->DB = mysql_connect($host, $username, $password);
$this->query("SET NAMES 'utf8'", $this->link);
return $this->DB;
} private function __clone(){} public static function getInstance($host, $username, $password)
{
if( !(self::$_instance instanceof self) )
{
self::$_instance = new self($host, $username, $password);
}
return self::$_instance;
} // 连接数据表
public function select_db($database)
{
$this->result = mysql_select_db($database);
return $this->result;
} // 执行SQL语句
public function query($query)
{
return $this->result = mysql_query($query, $this->link);
} // 将结果集保存为数组
public function fetch_array($fetch_array)
{
return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC);
} // 获得记录数目
public function num_rows($query)
{
return $this->result = mysql_num_rows($query);
} // 关闭数据库连接
public function close()
{
return $this->result = mysql_close($this->link);
} }
?>
使用的时候:
$con = Mysql::getInstance($host, $username, $password);
$con -> select_db($database);
当然,单例模式不仅仅只是应用在数据库的操作类上面。还可以应用在这些方面:
1. 网站的计数器,一般也是采用单例模式实现,否则难以同步。
2. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
3. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
原出处https://www.cnblogs.com/miketwais/articles/Singleton_pattern.html
PHP单例模式及应用场的更多相关文章
- ServletConfig对象和它在开发中的应用场
package cn.itcast; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumerat ...
- 如何选择版本控制系统之二---Git的研发应用场
之前写了一篇<如何选择版本控制系统 ---为什么选择Git版本控制系统>,地址是:http://www.cnblogs.com/goldenfish/p/6876864.html,有兴趣的 ...
- python全栈开发-Day10 装饰器(闭合函数的应用场)
一. 装饰器 装饰器就是闭包函数的一种应用场景 什么是闭包函数?我们再来回忆一下: 闭包函数: 定义在函数内部的函数,并且该函数包含对外部函数作用域(强调:对全局作用域名字的引用不算闭包)名字的引用, ...
- [设计模式1]--单例模式(SINGLETON)
搞笑解释: 俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我 定义: 单例模式确保某一个类只有一个实例,而且自行实例化并向整 ...
- C# - 缓存OutputCache(二)缓存详细介绍
本文是通过网上&个人总结的 1.缓存介绍 缓存是为了提高访问速度,而做的技术. 缓存主要有以下几类:1)客户端缓存Client Caching 2)代理缓存Proxy Caching 3)方向 ...
- 【开源】C#跨平台物联网通讯框架ServerSuperIO(SSIO)
[连载]<C#通讯(串口和网络)框架的设计与实现>-1.通讯框架介绍 [连载]<C#通讯(串口和网络)框架的设计与实现>-2.框架的总体设计 目 录 C#跨平台物联 ...
- 开源物联网框架ServerSuperIO 3.0正式发布(C#),跨平台:Win&Win10 Iot&Ubuntu&Ubuntu Mate,一套设备驱动跨平台挂载,附:开发套件和教程。
3.0版本主要更新内容: 1.增加跨平台能力:Win&Win10 Iot&Ubuntu&Ubuntu Mate 2.统一设备驱动接口:可以一套设备驱动,跨平台挂载运行,降低人力 ...
- 物联网框架SuperIO 2.2.9和ServerSuperIO 2.1同时更新,更适用于类似西门子s7-200发送多次数据,才能读取数据的情况
一.解决方案 二.更新内容 1.修改IRunDevice接口,把void Send(io,bytes)改成int Send(io,bytes).2.修改网络控制器,发送数据不直接使用IO实例,改为使用 ...
- 开源跨平台IOT通讯框架ServerSuperIO,集成到NuGet程序包管理器,以及Demo使用说明
物联网涉及到各种设备.各种传感器.各种数据源.各种协议,并且很难统一,那么就要有一个结构性的框架解决这些问题.SSIO就是根据时代发展的阶段和现实实际情况的结合产物. 各种数据信息,如下图 ...
随机推荐
- vue 3
目录 复习 Vue项目需要自建服务器:node npm:包管理器 - 为node拓展功能的 vue cli环境:脚手架 - 命令行快速创建项目 创建Vue项目 启动项目 项目目录 组件 在根组件中渲染 ...
- [暴力+前缀和]2019牛客暑期多校训练营(第六场)Upgrading Technology
链接:https://ac.nowcoder.com/acm/contest/886/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- angularjs中$parse的用法
转载自:https://umur.blog/2014/02/25/advanced-angular-parse/ 高级Angular:$ parse 如果你想加强你的AngularJS知识,$ par ...
- Python——迭代器的几个高级用法
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第8篇文章. 今天我们依然介绍的是迭代器,不过介绍的是几个比较常用的高级用法,在实际场景当中非常实用,可以帮助我们大 ...
- js事件的获取
获取元素样式属性 Method DES clientWidth 获取元素宽度 clientHeight 获取元素高度(内容+内边距) document.body.clientWidth 获取body宽 ...
- macbook中python3环境的配置
首先,打开环境配置文件 在终端输入: open ~/.bash_profile 如果没有.bash_profile 文件 先创建该文件:进入创建目录输入下面命令 vim ~/.bash_profile ...
- [vijos1554&bzoj1411]硬币游戏<快速幂>
题目链接:https://vijos.org/p/1554 http://www.lydsy.com/JudgeOnline/problem.php?id=1411 这题真的淫*QAQ... 一看题还 ...
- 【JavaScript】要点知识的个人总结(1)
米娜桑,哦哈哟~ 该篇章主要基于链接中的参考内容和代码测试得出的结论,面向具有一定基础的前端开发者.如有错误,请指出与包涵. 原型链的解释 https://juejin.im/post/5aa78fe ...
- 用css3实现摩天轮旋转的动画效果
用css3实现摩天轮旋转的动画效果 1.CSS3 @keyframes 规则如需在 CSS3 中创建动画,您需要学习 @keyframes 规则.@keyframes 规则用于创建动画.在 @keyf ...
- python学习笔记--字符串格式化
字符串和常量 print(r'hello\py\thon') r 代表后面字符不进行转义,原样输出; 表示常量,命名时变量名字大写代表常量.NAME = 'liulixue'; 字符串表示:' ', ...