一、什么是单例模式?

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. 201521123017 《Java程序设计》第6周学习总结

    1. 本周学习总结 <> 2. 书面作业 Q1.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 1. ...

  2. 201521123086《java程序设计》第四周

    本章学习总结 尝试使用思维导图总结有关继承的知识点 1.2 使用常规方法总结其他上课内容. 为了不必要写重复的代码,可以运用继承,用关键字extends来定义一个类,被继承的类叫做父类,继承的类叫做子 ...

  3. 201521123063 《Java程序设计》 第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...

  4. 201521123025《java程序设计》第11周学习总结

    1. 本周学习总结 2. 书面作业 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步 ...

  5. 201521123014《Java程序设计》第13周学习总结

    1. 本周学习总结 思维导图: 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? ...

  6. Java实现基本排序算法

    稳定排序算法性能比较 冒泡排序代码: /** * 冒泡排序 * * @param arr * @return */ public int[] bubbleSort(int[] arr) { int t ...

  7. Spring配置属性文件

    在项目开发阶段和交付阶段数据库的连接信息往往是不同的,可以把这些信息写成属性文件,再在Spring中导入即可引用 jdbc.properties属性文件如下: jdbc.driverClassName ...

  8. JPA关系映射之one-to-many和many-to-one

    one-to-many(一对多)和many-to-one(多对一)双向关联 假设部门与员工是一对多关系,反过来员工与部门就是多对一关系. Dept.java类 public class Dept im ...

  9. Linux中组 与 用户的管理

    在linux中建立组的指令是 groupadd 组名 相应的,删除组的指令: groupdel 组名 查看自己用户的组: groups 一个用户可以在多个组里面,用这个命令可以将用户添加到组: add ...

  10. hdfs存取文件机制

    HDFS和HBase是Hadoop中两种主要的存储文件系统,两者适用的场景不同,HDFS适用于大文件存储,HBASE适用于大量小文件存储.本文主要讲解HDFS文件系统中客户端是如何从Hadoop集群中 ...