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 相关文章推荐
简单易用的计数器(数据库)
Oct 09 PHP
理解和运用PHP中的多态性[译]
Aug 02 PHP
php图片加水印原理(超简单的实例代码)
Jan 18 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
Yii中render和renderPartial的区别
Sep 03 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
php防止网站被攻击的应急代码
Oct 21 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
Apr 25 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 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
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
php 上传功能实例代码
2010/04/13 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
AngularJS入门之动画
2016/07/27 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
python实现list由于numpy array的转换
2018/04/04 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
汇智创新科技发展有限公司
2015/12/06 面试题
物业管理个人自我评价
2013/11/08 职场文书
开朗女孩的自我评价
2014/02/10 职场文书
库房保管员岗位职责
2014/04/07 职场文书
协议书范本
2014/04/23 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
行政处罚事先告知书
2015/07/01 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python
nginx 配置缓存
2022/05/11 Servers