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 相关文章推荐
PHP5中使用DOM控制XML实现代码
May 07 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
Apr 17 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
怎样使用php与jquery设置和读取cookies
Aug 08 PHP
基于PHP实现假装商品限时抢购繁忙的效果
Oct 16 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
php实现中文转数字
Feb 18 PHP
利用Laravel事件系统如何实现登录日志的记录详解
May 20 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
php抽象方法和普通方法的区别点总结
Oct 13 PHP
PHP对接阿里云虚拟号的实现(号码隐私保护)
Apr 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
德生PL550的电路分析
2021/03/02 无线电
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
document.documentElement &amp;&amp; document.documentElement.scrollTop
2007/12/01 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
海量经典的jQuery插件集合
2010/01/12 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
js+css实现回到顶部按钮(back to top)
2016/03/02 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
Python异常学习笔记
2015/02/03 Python
wxPython中listbox用法实例详解
2015/06/01 Python
Python实现数据库编程方法详解
2015/06/09 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
2014迎新年晚会策划方案
2014/02/23 职场文书
质量管理标语
2014/06/12 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
工作试用期自我评价
2015/03/10 职场文书
小学数学国培研修日志
2015/11/13 职场文书
导游词之无锡梅园
2019/11/28 职场文书
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android