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 相关文章推荐
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
php验证session无效的解决方法
Nov 04 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
php商品对比功能代码分享
Sep 24 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
Oct 12 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
Oct 21 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 PHP
数据结构之利用PHP实现二分搜索树
Oct 25 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(1)
2006/10/09 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
PHP数组操作类实例
2015/07/11 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
jquery ajax post提交数据乱码
2013/11/05 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
Vue动态加载异步组件的方法
2018/11/21 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
JS如何生成动态列表
2020/09/22 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
就业推荐表自我鉴定
2014/03/21 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
2015年公务员工作总结
2015/04/24 职场文书
大国崛起观后感
2015/06/02 职场文书
企业法人任命书
2015/09/21 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP