设为首页 收藏本站
查看: 1048|回复: 0

[经验分享] PHP 单例模式解析和实战

[复制链接]

尚未签到

发表于 2017-3-30 08:42:27 | 显示全部楼层 |阅读模式
一、什么是单例模式?
1、含义   
   作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
2、单例模式的三个要点:
(1). 需要一个保存类的唯一实例的静态成员变量:

[php] view plaincopyprint? 



  • private static $_instance;   

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

 
[php] view plaincopyprint? 



  • private function __construct()   
  • {   
  •     $this->_db = pg_connect('xxxx');  
  • }   
  • private function __clone()  
  • {  
  • }//覆盖__clone()方法,禁止克隆  
  •    

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



  • public static function getInstance()    
  • {    
  •     if(! (self::$_instance instanceof self) )   
  •     {    
  •         self::$_instance = new self();    
  •     }  
  •     return self::$_instance;    
  •   
  • }   

  


二、为什么要使用单例模式?
1、PHP缺点:        

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

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

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

 
三、如何实现单例模式?
1、普通的数据库访问例子:
[php] view plaincopyprint? 



  • <?php  
  • ......  
  • //初始化一个数据库句柄  
  • $db = new DB(...);  
  •   
  • //添加用户信息  
  • $db->addUserInfo(...);  
  •   
  • ......  
  •   
  • //在函数中访问数据库,查找用户信息  
  • function getUserInfo()  
  • {  
  •     $db = new DB(...);//再次new 数据库类,和数据库建立连接  
  •     $db = query(....);//根据查询语句访问数据库  
  • }  
  •   
  • ?>  

 
2、应用单例模式对数据库进行操作:
[php] view plaincopyprint? 



  • <?php  
  •   
  • class DB    
  • {    
  •     private $_db;    
  •     private static $_instance;    
  •     
  •     private function __construct(...)    
  •     {    
  •         $this->_db = pg_connect(...);//postgrsql    
  •     }    
  •     
  •     private function __clone() {};  //覆盖__clone()方法,禁止克隆    
  •     
  •     public static function getInstance()    
  •     {    
  •         if(! (self::$_instance instanceof self) ) {    
  •             self::$_instance = new self();    
  •         }    
  •         return self::$_instance;    
  •     }    
  •     
  •       
  •   
  •     public function addUserInfo(...)  
  •     {  
  •   
  •      
  •   
  •     }  
  •   
  •      public function getUserInfo(...)  
  •     {   
  •   
  •     }  
  •   
  • }  
  •   
  • //test  
  •   
  • $db = DB::getInstance();  
  •   
  • $db->addUserInfo(...);  
  •   
  • $db->getUserInfo(...);  
  •   
  •   
  • ?>  

  


 

3、深入理解

 
[php] view plaincopyprint? 



  • <?php  
  • class db {  
  •     public $conn;  
  •     public static $sql;  
  •     public static $instance=null;  
  •     private function __construct(){  
  •         require_once('db.config.php');  
  •         $this->conn = mysql_connect($db['host'],$db['user'],$db['password']);  
  •         if(!mysql_select_db($db['database'],$this->conn)){  
  •             echo "失败";  
  •         };  
  •         mysql_query('set names utf8',$this->conn);         
  •     }  
  •     public static function getInstance(){  
  •         if(is_null(self::$instance)){  
  •             self::$instance = new db;  
  •         }  
  •         return self::$instance;  
  •     }  
  •     /** 
  •      * 查询数据库 
  •      */  
  •     public function select($table,$condition=array(),$field = array()){  
  •         $where='';  
  •         if(!empty($condition)){  
  •               
  •             foreach($condition as $k=>$v){  
  •                 $where.=$k."='".$v."' and ";  
  •             }  
  •             $where='where '.$where .'1=1';  
  •         }  
  •         $fieldstr = '';  
  •         if(!empty($field)){  
  •               
  •             foreach($field as $k=>$v){  
  •                 $fieldstr.= $v.',';  
  •             }  
  •              $fieldstr = rtrim($fieldstr,',');  
  •         }else{  
  •             $fieldstr = '*';  
  •         }  
  •         self::$sql = "select {$fieldstr} from {$table} {$where}";  
  •         $result=mysql_query(self::$sql,$this->conn);  
  •         $resuleRow = array();  
  •         $i = 0;  
  •         while($row=mysql_fetch_assoc($result)){  
  •             foreach($row as $k=>$v){  
  •                 $resuleRow[$i][$k] = $v;  
  •             }  
  •             $i++;  
  •         }  
  •         return $resuleRow;  
  •     }  
  •     /** 
  •      * 添加一条记录 
  •      */  
  •      public function insert($table,$data){  
  •         $values = '';  
  •         $datas = '';  
  •         foreach($data as $k=>$v){  
  •             $values.=$k.',';  
  •             $datas.="'$v'".',';  
  •         }  
  •         $values = rtrim($values,',');  
  •         $datas   = rtrim($datas,',');  
  •         self::$sql = "INSERT INTO  {$table} ({$values}) VALUES ({$datas})";  
  •         if(mysql_query(self::$sql)){  
  •             return mysql_insert_id();  
  •         }else{  
  •             return false;  
  •         };  
  •      }  
  •      /** 
  •       * 修改一条记录 
  •       */  
  •     public function update($table,$data,$condition=array()){  
  •         $where='';  
  •         if(!empty($condition)){  
  •               
  •             foreach($condition as $k=>$v){  
  •                 $where.=$k."='".$v."' and ";  
  •             }  
  •             $where='where '.$where .'1=1';  
  •         }  
  •         $updatastr = '';  
  •         if(!empty($data)){  
  •             foreach($data as $k=>$v){  
  •                 $updatastr.= $k."='".$v."',";  
  •             }  
  •             $updatastr = 'set '.rtrim($updatastr,',');  
  •         }  
  •         self::$sql = "update {$table} {$updatastr} {$where}";  
  •         return mysql_query(self::$sql);  
  •     }  
  •     /** 
  •      * 删除记录 
  •      */  
  •      public function delete($table,$condition){  
  •         $where='';  
  •         if(!empty($condition)){  
  •               
  •             foreach($condition as $k=>$v){  
  •                 $where.=$k."='".$v."' and ";  
  •             }  
  •             $where='where '.$where .'1=1';  
  •         }  
  •         self::$sql = "delete from {$table} {$where}";  
  •         return mysql_query(self::$sql);  
  •           
  •      }  
  •       
  •     public static function getLastSql(){  
  •         echo self::$sql;  
  •     }  
  •       
  •       
  •       
  • }  
  •   
  • $db = db::getInstance();  
  • //$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array('name','password'));  
  • //echo $db->insert('demo',array('name'=>'最近你啦','password'=>'123'));  
  • //echo $db->update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1));  
  • echo $db->delete('demo',array('id'=>'2'));  
  • db::getLastSql();  
  • echo "<pre>";  
  • ?>  

  转载自: http://blog.csdn.net/jungsagacity/article/details/7618587

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-357357-1-1.html 上篇帖子: PHP 中获取文件名及路径 下篇帖子: php 5.3带来了什么(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表