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 相关文章推荐
第十二节--类的自动加载
Nov 16 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
Apr 11 PHP
PHP学习之字符串比较和查找
Apr 17 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
php 注册时输入信息验证器的实现详解
Jul 05 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
Nov 05 PHP
PHP合并静态文件详解
Nov 14 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 PHP
php正则替换处理HTML页面的方法
Jun 17 PHP
PHP实现的浏览器检查类
Apr 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
树型结构列出指定目录里所有文件的PHP类
2006/10/09 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
python基于socket实现网络广播的方法
2015/04/29 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
Python格式化输出%s和%d
2018/05/07 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
Python验证码截取识别代码实例
2020/05/16 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
食品安全责任书
2014/04/15 职场文书
大专生找工作自荐书
2014/06/10 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
活动简报范文
2015/07/22 职场文书
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
Elasticsearch 数据类型及管理
2022/04/19 Python
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers