PHP实现单例模式建立数据库连接的方法分析


Posted in PHP onFebruary 11, 2020

本文实例讲述了PHP实现单例模式建立数据库连接的方法。分享给大家供大家参考,具体如下:

理解php单例模式

一、什么是单例

wiki百科:单例模式,也叫单子模式,是一种常用的软件设计模式。 在应用这个模式时,单例对象的类必须保证只有一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

二、为什么用单例

实际项目中像数据库查询,日志输出,全局回调,统一校验等模块。这些模块功能单一,但需要多次访问,如果能够全局唯一,多次复用会大大提升性能。这也就是单例存在的必要性。

三、单例模式的好处

1:减少频繁创建,节省了cpu。

2:静态对象公用,节省了内存。

3:功能解耦,代码已维护。

四、如何设计单例

通过上面的描述,单例的核心是,实例一次生成,全局唯一,多次调用。因此在单例模式必须包含三要素:

1:私有化构造函数,私有化clone。也就是不能new,不能clone。【唯一】

2:拥有一个静态变量,用于保存当前的类。【唯一如何保存】

3:提供一个公共的访问入口。【可以访问】

五、建立数据库连接

PS:功能上不太完整,以后再补充**__**

/**
 * 单例模式连接数据库--面向对象
 * */
//final关键字阻止此类被继承
final class sql2
{
  static $instance;
  static $connect;
  protected $result;
  //protected关键字阻止此类在外部进行实例化
  protected function __construct($host, $user, $password)
  {
    self::$connect = @new mysqli($host, $user, $password);
    if (self::$connect->connect_errno) {
      die(iconv('gbk', 'utf-8', self::$connect->connect_error) . '(' . self::$connect->connect_errno . ')');
    }
  }
  //protected关键字阻止此类在外部进行克隆
  protected function __clone()
  {
  }
  //当对象被销毁时关闭连接
  function __destruct()
  {
    self::$connect->close();
  }
  //获取实例
  static function getInstance($host, $user, $password)
  {
    self::$instance = self::$instance ?: new self($host, $user, $password);
    return self::$instance;
  }
  //选择数据库
  function set_db($db)
  {
    if (!self::$connect->select_db($db)) {
      die(iconv('gbk', 'utf-8', self::$connect->error) . '(' . self::$connect->errno . ')');
    }
  }
  //执行SQL语句
  function query($query)
  {
    if (!($re = self::$connect->query($query))) {
      die(iconv('gbk', 'utf-8', self::$connect->error) . '(' . self::$connect->errno . ')');
    }
    $this->result = $re;
    return $re;
  }
  //以数组形式返回查询结果
  function fetch_arr($query)
  {
    $re = $this->query($query);
    $res = [];
    while ($row = $re->fetch_assoc()) {
      $res[] = $row;
    }
    return $res;
  }
  //获取记录数
  function get_row()
  {
    return $this->result->num_rows;
  }
}
$ins = sql2::getInstance('127.0.0.1', 'root', 'root');
$ins->set_db('houtai');
$re = $ins->fetch_arr('select * from user ');
//var_dump($re);
$ins->get_row();

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
木翼下载系统中说明的PHP安全配置方法
Jun 16 PHP
php仿ZOL分页类代码
Oct 02 PHP
php_xmlhttp 乱码问题解决方法
Aug 07 PHP
在smarty模板中使用PHP函数的方法
Apr 23 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
php实现分页工具类分享
Jan 09 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
php编程每天必学之表单验证
Mar 01 PHP
php中让人头疼的浮点数运算分析
Oct 10 PHP
老生常谈PHP位运算的用途
Mar 12 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
php实现根据身份证获取精准年龄
Feb 26 PHP
php-7.3.6 编译安装过程
Feb 11 #PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 #PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 #PHP
tp5框架基于ajax实现异步删除图片的方法示例
Feb 10 #PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 #PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 #PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 #PHP
You might like
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
Oracle Faq(Oracle的版本)
2006/10/09 PHP
PHP 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
require.js的用法详解
2015/10/20 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
js实现微信聊天效果
2020/08/09 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
2020/10/29 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
python装饰器与递归算法详解
2016/02/18 Python
深入理解Python中的*重复运算符
2017/10/28 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
销售文员岗位职责
2013/11/29 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
先进个人材料怎么写
2014/12/30 职场文书
工程部部长岗位职责
2015/02/12 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
Python jiaba库的使用详解
2021/11/23 Python
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技