php  单例模式详细介绍及实现源码


Posted in PHP onNovember 05, 2016

这篇文章主要介绍了PHP中数据库单例模式的实现代码分享,本文先是讲解了单例模式的一些知识,然后给出了数据库单例模式实现代码。

什么是单例模式

单例模式顾名思义,就是只有一个实例。

作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例类。

单例模式的要点有三个:

一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。 

为什么要使用PHP单例模式?

1、php的应用主要在于数据库应用、所以一个应用中会存在大量的数据库操作、使用单例模式、则可以避免大量的new 操作消耗的资源

2、如果系统中需要有一个类来全局控制某些配置信息、那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分

3、在一次页面请求中、便于进行调试、因为所有的代码(例如数据库操作类db)都集中在一个类中、我们可以在类中设置钩子、输出日志、从而避免到处var_dump、echo

单例类

1、构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象)、单例类不能在其他类中实例化、只能被其自身实例化

2、拥有一个保存类的实例的静态成员变量

3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类、通过instanceof操作符可以检测到类是否已经被实例化)

4、另外、需要创建__clone()方法防止对象被复制(克隆)

php单例模式实现方法

单例模式在特定的情况下可以节省资源的消耗,例如同一页面对数据库的多次操作,不需要去new多次从而节省了资源。

单例模式的关键在于PHP中的“instanceof”,它用来检测一个变量是否是某个类的一个实例。

同时,为了防止用户去new实例,需要将“__construct”函数权限设置为private。

为了防止用户进行clone,也要重写“__clone”方法。

<?php
/*
 * 单例数据库连接
 */
class Db {
  private static $_instance; //static可以保存值不丢失
  private static $_dbConnect;
  private $_dbConfig = array(
    'host' => '127.0.0.1',
    'user' => 'root',
    'password' => '',
    'database' => 'yii2basic',
  );//保存数据库的配置信息

  //使用private防止用户new
  private function __construct(){

  }

  //重写clone防止用户进行clone
  public function __clone(){
    //当用户clone操作时产生一个错误信息
    trigger_error("Can't clone object",E_USER_ERROR);
  }  

  //由类的自身来进行实例化 (作者:码农教程 http://www.manongjc.com )
  public static function getInstance(){
    if(!(self::$_instance instanceof self)){
      self::$_instance = new self();
    }
    return self::$_instance;
  }

  public function connect(){
    self::$_dbConnect = @mysql_connect($this->_dbConfig['host'],
      $this->_dbConfig['user'],$this->_dbConfig['password']);

    if(!self::$_dbConnect){
      throw new Exception("mysql connect error".mysql_error());
      //die("mysql connect error".mysql_error());
    }

    mysql_query("SET NAMES UTF8");
    mysql_select_db($this->_dbConfig['database'],self::$_dbConnect);
    return self::$_dbConnect;
  }
}

$a = Db::getInstance();
try{
  $a->connect();
}catch(Exception $e){
  echo "sorry,error was happend.".$e->getMessage();
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
source.php查看源文件
Dec 09 PHP
PHP之变量、常量学习笔记
Mar 27 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
php中http_build_query 的一个问题
Mar 25 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
Jun 12 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
Mar 03 PHP
php使用PDO获取结果集的方法
Feb 16 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
PHP strcmp()和strcasecmp()的区别实例
Nov 05 #PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 #PHP
php使用file函数、fseek函数读取大文件效率对比分析
Nov 04 #PHP
支付宝支付开发――当面付条码支付和扫码支付实例
Nov 04 #PHP
Redis使用Eval多个键值自增的操作实例
Nov 04 #PHP
php array_slice 取出数组中的一段序列实例
Nov 04 #PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 #PHP
You might like
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
PHP目录操作实例总结
2016/09/27 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
javascript 关闭IE6、IE7
2009/06/01 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
Python几种常见算法汇总
2020/06/02 Python
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
七年级英语教学反思
2016/02/15 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书