一、什么是单例模式?

1、含义

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

2、单例模式的三个要点:

(1). 需要一个保存类的唯一实例的静态成员变量:

  1. private static $_instance;

(2). 构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义:

  1. private function __construct()
  2. {
  3. $this->_db = pg_connect('xxxx');
  4. }
  5. private function __clone()
  6. {
  7. }//覆盖__clone()方法,禁止克隆

(3). 必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用

  1. public static function getInstance()
  2. {
  3. if(! (self::$_instance instanceof self) )
  4. {
  5. self::$_instance = new self();
  6. }
  7. return self::$_instance;
  8. }

二、为什么要使用单例模式?

1、PHP缺点:

PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java
编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然
而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似
乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。

数据库交互

一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。

(2)、控制配置信息

如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现.

三、如何实现单例模式?

1、普通的数据库访问例子:

  1. <?php
  2. ......
  3. //初始化一个数据库句柄
  4. $db = new DB(...);
  5. //添加用户信息
  6. $db->addUserInfo(...);
  7. ......
  8. //在函数中访问数据库,查找用户信息
  9. function getUserInfo()
  10. {
  11. $db = new DB(...);//再次new 数据库类,和数据库建立连接
  12. $db = query(....);//根据查询语句访问数据库
  13. }
  14. ?>

2、应用单例模式对数据库进行操作:

  1. <?php
  2. class DB
  3. {
  4. private $_db;
  5. private static $_instance;
  6. private function __construct(...)
  7. {
  8. $this->_db = pg_connect(...);//postgrsql
  9. }
  10. private function __clone() {};  //覆盖__clone()方法,禁止克隆
  11. public static function getInstance()
  12. {
  13. if(! (self::$_instance instanceof self) ) {
  14. self::$_instance = new self();
  15. }
  16. return self::$_instance;
  17. }
  18. public function addUserInfo(...)
  19. {
  20. }
  21. public function getUserInfo(...)
  22. {
  23. }
  24. }
  25. //test
  26. $db = DB::getInstance();
  27. $db->addUserInfo(...);
  28. $db->getUserInfo(...);
  29. ?>
3、深入理解
    1. <?php
    2. class db {
    3. public $conn;
    4. public static $sql;
    5. public static $instance=null;
    6. private function __construct(){
    7. require_once('db.config.php');
    8. $this->conn = mysql_connect($db['host'],$db['user'],$db['password']);
    9. if(!mysql_select_db($db['database'],$this->conn)){
    10. echo "失败";
    11. };
    12. mysql_query('set names utf8',$this->conn);
    13. }
    14. public static function getInstance(){
    15. if(is_null(self::$instance)){
    16. self::$instance = new db;
    17. }
    18. return self::$instance;
    19. }
    20. /**
    21. * 查询数据库
    22. */
    23. public function select($table,$condition=array(),$field = array()){
    24. $where='';
    25. if(!empty($condition)){
    26. foreach($condition as $k=>$v){
    27. $where.=$k."='".$v."' and ";
    28. }
    29. $where='where '.$where .'1=1';
    30. }
    31. $fieldstr = '';
    32. if(!empty($field)){
    33. foreach($field as $k=>$v){
    34. $fieldstr.= $v.',';
    35. }
    36. $fieldstr = rtrim($fieldstr,',');
    37. }else{
    38. $fieldstr = '*';
    39. }
    40. self::$sql = "select {$fieldstr} from {$table} {$where}";
    41. $result=mysql_query(self::$sql,$this->conn);
    42. $resuleRow = array();
    43. $i = 0;
    44. while($row=mysql_fetch_assoc($result)){
    45. foreach($row as $k=>$v){
    46. $resuleRow[$i][$k] = $v;
    47. }
    48. $i++;
    49. }
    50. return $resuleRow;
    51. }
    52. /**
    53. * 添加一条记录
    54. */
    55. public function insert($table,$data){
    56. $values = '';
    57. $datas = '';
    58. foreach($data as $k=>$v){
    59. $values.=$k.',';
    60. $datas.="'$v'".',';
    61. }
    62. $values = rtrim($values,',');
    63. $datas   = rtrim($datas,',');
    64. self::$sql = "INSERT INTO  {$table} ({$values}) VALUES ({$datas})";
    65. if(mysql_query(self::$sql)){
    66. return mysql_insert_id();
    67. }else{
    68. return false;
    69. };
    70. }
    71. /**
    72. * 修改一条记录
    73. */
    74. public function update($table,$data,$condition=array()){
    75. $where='';
    76. if(!empty($condition)){
    77. foreach($condition as $k=>$v){
    78. $where.=$k."='".$v."' and ";
    79. }
    80. $where='where '.$where .'1=1';
    81. }
    82. $updatastr = '';
    83. if(!empty($data)){
    84. foreach($data as $k=>$v){
    85. $updatastr.= $k."='".$v."',";
    86. }
    87. $updatastr = 'set '.rtrim($updatastr,',');
    88. }
    89. self::$sql = "update {$table} {$updatastr} {$where}";
    90. return mysql_query(self::$sql);
    91. }
    92. /**
    93. * 删除记录
    94. */
    95. public function delete($table,$condition){
    96. $where='';
    97. if(!empty($condition)){
    98. foreach($condition as $k=>$v){
    99. $where.=$k."='".$v."' and ";
    100. }
    101. $where='where '.$where .'1=1';
    102. }
    103. self::$sql = "delete from {$table} {$where}";
    104. return mysql_query(self::$sql);
    105. }
    106. public static function getLastSql(){
    107. echo self::$sql;
    108. }
    109. }
    110. $db = db::getInstance();
    111. //$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array('name','password'));
    112. //echo $db->insert('demo',array('name'=>'最近你啦','password'=>'123'));
    113. //echo $db->update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1));
    114. echo $db->delete('demo',array('id'=>'2'));
    115. db::getLastSql();
    116. echo "<pre>";
    117. ?>

PHP 单例模式解析和实战的更多相关文章

  1. 学习TF:《TensorFlow技术解析与实战》PDF+代码

    TensorFlow 是谷歌公司开发的深度学习框架,也是目前深度学习的主流框架之一.<TensorFlow技术解析与实战>从深度学习的基础讲起,深入TensorFlow框架原理.模型构建. ...

  2. Elasticsearch技术解析与实战 PDF (内含目录)

    Elasticsearch技术解析与实战                                  介绍: Elasticsearch是一个强[0大0]的搜索引擎,提供了近实时的索引.搜索.分 ...

  3. Web安全测试中常见逻辑漏洞解析(实战篇)

    Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...

  4. elasticsearch技术解析与实战ES

    elasticsearch技术解析与实战ES 下载地址: https://pan.baidu.com/s/1NpPX05C0xKx_w9gBYaMJ5w 扫码下面二维码关注公众号回复100008 获取 ...

  5. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

    前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...

  6. 《Android源代码设计模式解析与实战》读书笔记(十七)

    第十七章.中介者模式 中介者模式也称为调解者模式或调停者模式,是一种行为型模式. 1.定义 中介者模式包装了一系列对象相互作用的方式.使得这些对象不必相互明显作用.从而使它们能够松散耦合.当某些对象之 ...

  7. 《Android源代码设计模式解析与实战》读书笔记(十)

    第十章.解释器模式 解释器模式是一种用的比較少的行为型模式.其提供了一种解释语言的语法或表达式的方式. 可是它的使用场景确实非常广泛,仅仅是由于我们自己非常少回去构造一个语言的文法,所以使用较少. 1 ...

  8. Java日志框架解析及实战分析

    转载自: https://zhuanlan.zhihu.com/p/24272450 https://zhuanlan.zhihu.com/p/24275518 作为Java程序员,幸运的是,Java ...

  9. 深入解析Vuex实战总结

    这篇文章主要介绍了Vuex的初探与实战小结,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. 1.背景 最近在做一个单页面的管理后台项目,为了提高开 ...

随机推荐

  1. 201521123101 《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...

  2. 201521123031 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  3. 使用vue-router实现返回

    在vue项目中使用vue-router做路由,做到返回页面的逻辑时,由于window.history.back满足不了返回的需要,故想通过 window.addEventListener('popst ...

  4. node.js的安装及配置

    一.安装 直接在浏览器搜索node.js,在官网上下载(一般旧版的更加稳定,比如下载4.4.7版本) 点击DOWNLOADS 往下翻,点击Previous Release Windows下载msi(6 ...

  5. Struts+Spring+Hibernate项目整合AJAX+JSON

    1.什么是AJAX AJAX是 "Asynchronous JavaScript and XML" 的简称,即异步的JavaScript和XML. 所谓异步,就是提交一个请求不必等 ...

  6. java 数组内的最大组合数

    给定一个任意长度的java数组,求数组内的数能组合出来的最大整数比如说{9,98,123,32} 最大就是 99832123 import java.util.Arrays; import java. ...

  7. SimpleRpc-序列化与反序列化的设计与实现

    为什么需要序列化和反序列化? 假设你是客户端,现在要调用远程的加法计算服务,你与服务端商定好了发送数据的格式:发送8个字节的请求,前4字节是第一个数,后4字节是第二个数,服务端读取数据的时候也按照商定 ...

  8. [转]Xcode的快捷键及代码格式化

    Xcode比较常用的快捷键,特别是红色标注的,很常用.1. 文件CMD + N: 新文件CMD + SHIFT + N: 新项目CMD + O: 打开CMD + S: 保存CMD+OPt+S:保存所有 ...

  9. Angularjs –– Expressions(表达式)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ Angular的表达式 Angular的表达式和JavaScript代码很像,不过通常A ...

  10. Divide Sum 比赛时竟然想不出。。。。。。。

    Divide Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...