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下通过POST还是GET来传值
Jun 05 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
php生成txt文件标题及内容的方法
Jan 16 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 PHP
php实现微信发红包
Dec 05 PHP
抛弃 PHP 代价太高
Apr 26 PHP
100多行PHP代码实现socks5代理服务器[2]
May 05 PHP
jQuery+php简单实现全选删除的方法
Nov 28 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
Mar 02 PHP
PHP实现Redis单据锁以及防止并发重复写入
Apr 10 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 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 身份证号验证函数
2009/05/07 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
php生成QRcode实例
2014/09/22 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
json对象转字符串如何实现
2012/12/02 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
用python做游戏的细节详解
2019/06/25 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
python实现连连看游戏
2020/02/14 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
悦木之源美国官网:Origins美国
2016/08/01 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
节约粮食标语
2014/06/18 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
改革共识倡议书
2014/08/29 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
安全守法证明
2015/06/23 职场文书
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python