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
如何使用Linux的Crontab定时执行PHP脚本的方法
Dec 19 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
yii操作session实例简介
Jul 31 PHP
PHP四舍五入、取整、round函数使用示例
Feb 06 PHP
php递归遍历多维数组的方法
Apr 18 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
PHP文件与目录操作示例
Dec 24 PHP
PHP jQuery+Ajax结合写批量删除功能
May 19 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Mar 29 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 cron中的批处理
2008/09/16 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
一个简单安全的PHP验证码类、PHP验证码
2016/09/24 PHP
Smarty模板语法详解
2019/07/20 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
由document.body和document.documentElement想到的
2009/04/13 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
JavaScript 常用函数库详解
2009/10/21 Javascript
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
利用Python实现kNN算法的代码
2019/08/16 Python
Pytorch的mean和std调查实例
2020/01/02 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
关于保护环境的建议书
2014/08/26 职场文书
工程索赔意向书
2014/08/30 职场文书
三问三解心得体会
2014/09/05 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
党员承诺书范文2015
2015/04/27 职场文书
教师节校长致辞
2015/07/31 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
三下乡活动心得体会
2016/01/23 职场文书
导游词之五台山
2019/10/11 职场文书
php将xml转化对象的实例详解
2021/11/17 PHP