PHP 单例模式解析和实战

本文介绍了单例模式的概念、实现方式及在PHP中的应用场景,详细解释了如何通过单例模式优化数据库连接管理,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是单例模式?

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()方法,禁止克隆  
  8.    


(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.   
  9. }   



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

1、PHP缺点:        

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


2、单例模式在PHP中的应用场合:

(1)、应用程序与数据库交互

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

(2)、控制配置信息

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


三、如何实现单例模式?

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

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


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

  1. <?php  
  2.   
  3. class DB    
  4. {    
  5.     private $_db;    
  6.     private static $_instance;    
  7.     
  8.     private function __construct(...)    
  9.     {    
  10.         $this->_db = pg_connect(...);//postgrsql    
  11.     }    
  12.     
  13.     private function __clone() {};  //覆盖__clone()方法,禁止克隆    
  14.     
  15.     public static function getInstance()    
  16.     {    
  17.         if(! (self::$_instance instanceof self) ) {    
  18.             self::$_instance = new self();    
  19.         }    
  20.         return self::$_instance;    
  21.     }    
  22.     
  23.       
  24.   
  25.     public function addUserInfo(...)  
  26.     {  
  27.   
  28.      
  29.   
  30.     }  
  31.   
  32.      public function getUserInfo(...)  
  33.     {   
  34.   
  35.     }  
  36.   
  37. }  
  38.   
  39. //test  
  40.   
  41. $db = DB::getInstance();  
  42.   
  43. $db->addUserInfo(...);  
  44.   
  45. $db->getUserInfo(...);  
  46.   
  47.   
  48. ?>  



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.               
  27.             foreach($condition as $k=>$v){  
  28.                 $where.=$k."='".$v."' and ";  
  29.             }  
  30.             $where='where '.$where .'1=1';  
  31.         }  
  32.         $fieldstr = '';  
  33.         if(!empty($field)){  
  34.               
  35.             foreach($field as $k=>$v){  
  36.                 $fieldstr.= $v.',';  
  37.             }  
  38.              $fieldstr = rtrim($fieldstr,',');  
  39.         }else{  
  40.             $fieldstr = '*';  
  41.         }  
  42.         self::$sql = "select {$fieldstr} from {$table} {$where}";  
  43.         $result=mysql_query(self::$sql,$this->conn);  
  44.         $resuleRow = array();  
  45.         $i = 0;  
  46.         while($row=mysql_fetch_assoc($result)){  
  47.             foreach($row as $k=>$v){  
  48.                 $resuleRow[$i][$k] = $v;  
  49.             }  
  50.             $i++;  
  51.         }  
  52.         return $resuleRow;  
  53.     }  
  54.     /** 
  55.      * 添加一条记录 
  56.      */  
  57.      public function insert($table,$data){  
  58.         $values = '';  
  59.         $datas = '';  
  60.         foreach($data as $k=>$v){  
  61.             $values.=$k.',';  
  62.             $datas.="'$v'".',';  
  63.         }  
  64.         $values = rtrim($values,',');  
  65.         $datas   = rtrim($datas,',');  
  66.         self::$sql = "INSERT INTO  {$table} ({$values}) VALUES ({$datas})";  
  67.         if(mysql_query(self::$sql)){  
  68.             return mysql_insert_id();  
  69.         }else{  
  70.             return false;  
  71.         };  
  72.      }  
  73.      /** 
  74.       * 修改一条记录 
  75.       */  
  76.     public function update($table,$data,$condition=array()){  
  77.         $where='';  
  78.         if(!empty($condition)){  
  79.               
  80.             foreach($condition as $k=>$v){  
  81.                 $where.=$k."='".$v."' and ";  
  82.             }  
  83.             $where='where '.$where .'1=1';  
  84.         }  
  85.         $updatastr = '';  
  86.         if(!empty($data)){  
  87.             foreach($data as $k=>$v){  
  88.                 $updatastr.= $k."='".$v."',";  
  89.             }  
  90.             $updatastr = 'set '.rtrim($updatastr,',');  
  91.         }  
  92.         self::$sql = "update {$table} {$updatastr} {$where}";  
  93.         return mysql_query(self::$sql);  
  94.     }  
  95.     /** 
  96.      * 删除记录 
  97.      */  
  98.      public function delete($table,$condition){  
  99.         $where='';  
  100.         if(!empty($condition)){  
  101.               
  102.             foreach($condition as $k=>$v){  
  103.                 $where.=$k."='".$v."' and ";  
  104.             }  
  105.             $where='where '.$where .'1=1';  
  106.         }  
  107.         self::$sql = "delete from {$table} {$where}";  
  108.         return mysql_query(self::$sql);  
  109.           
  110.      }  
  111.       
  112.     public static function getLastSql(){  
  113.         echo self::$sql;  
  114.     }  
  115.       
  116.       
  117.       
  118. }  
  119.   
  120. $db = db::getInstance();  
  121. //$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array('name','password'));  
  122. //echo $db->insert('demo',array('name'=>'最近你啦','password'=>'123'));  
  123. //echo $db->update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1));  
  124. echo $db->delete('demo',array('id'=>'2'));  
  125. db::getLastSql();  
  126. echo "<pre>";  
  127. ?> 
基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员用户两个主要模块。管理员负责视频、文件文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
标题基于SpringBoot的学生学习成果管理平台研究AI更换标题第1章引言介绍研究背景、目的、意义以及论文结构。1.1研究背景与目的阐述学生学习成果管理的重要性及SpringBoot技术的优势。1.2研究意义分析该平台对学生、教师及教育机构的意义。1.3论文方法与结构简要介绍论文的研究方法整体结构。第2章相关理论与技术概述SpringBoot框架、学习成果管理理论及相关技术。2.1SpringBoot框架简介介绍SpringBoot的基本概念、特点及应用领域。2.2学习成果管理理论基础阐述学习成果管理的核心理论发展趋势。2.3相关技术分析分析平台开发所涉及的关键技术,如数据库、前端技术等。第3章平台需求分析与设计详细分析平台需求,并设计整体架构及功能模块。3.1需求分析从学生、教师、管理员等角度对平台需求进行深入分析。3.2整体架构设计设计平台的整体架构,包括技术架构逻辑架构。3.3功能模块设计具体设计平台的核心功能模块,如成果展示、数据分析等。第4章平台实现与测试阐述平台的实现过程,并进行功能测试与性能分析。4.1平台实现详细介绍平台的开发环境、关键代码实现及技术难点解决方案。4.2功能测试对平台各项功能进行全面测试,确保功能正确无误。4.3性能分析分析平台的性能指标,如响应时间、并发处理能力等。第5章平台应用与效果评估探讨平台在实际教学中的应用,并对其效果进行评估。5.1平台应用案例选取典型应用案例,展示平台在实际教学中的使用情况。5.2效果评估方法介绍平台效果评估的具体方法指标。5.3评估结果分析根据评估数据,对平台的应用效果进行深入分析。第6章结论与展望总结论文的主要研究成果,并指出未来研究方向。6.1研究结论概括性地阐述论文的研究结论主要贡献。6.2研究展望针对当前研究的不足之处,提出未来改进扩展的方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值