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的类树(支持无限分类)
Oct 09 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
ThinkPHP3.1新特性之字段合法性检测详解
Jun 19 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
php常用表单验证类用法实例
Jun 18 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
PHP常见漏洞攻击分析
Feb 21 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
laravel 判断查询数据库返回值的例子
Oct 11 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实现Mysql读写分离
2013/06/28 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
Python代码的打包与发布详解
2014/07/30 Python
Python实现的快速排序算法详解
2017/08/01 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
Django自带的用户验证系统实现
2020/12/18 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
数据库方面面试题
2012/04/22 面试题
EJB3推出JPA的原因
2013/10/16 面试题
哈理工毕业生的求职信
2013/12/22 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
安装工程师岗位职责
2015/02/13 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
教师远程培训心得体会
2016/01/09 职场文书
Python 中random 库的详细使用
2021/06/03 Python