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和ACCESS写聊天室(四)
Oct 09 PHP
php include加载文件两种方式效率比较
Aug 08 PHP
MySQL连接数超过限制的解决方法
Jul 17 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
php ios推送(代码)
Jul 01 PHP
腾讯QQ微博API接口获取微博内容
Oct 30 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
Jun 09 PHP
php获取CSS文件中图片地址并下载到本地的方法
Dec 02 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
PHP以json或xml格式返回请求数据的方法
May 31 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 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中遍历二维数组的几种方法详解
2013/06/08 PHP
php字符串分割函数用法实例
2015/03/17 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
2017/05/13 jQuery
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
python实现划词翻译
2020/04/23 Python
python中文编码问题小结
2014/09/28 Python
Django中URLconf和include()的协同工作方法
2015/07/20 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
将python安装信息加入注册表的示例
2019/11/20 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
写给老师的保证书
2015/05/09 职场文书
汶川大地震感悟
2015/08/10 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript