• 售前

  • 售后

热门帖子
入门百科

PHP单例模式应用示例【多次毗连数据库只实例化一次】

[复制链接]
球死禁严 显示全部楼层 发表于 2021-10-26 13:47:12 |阅读模式 打印 上一主题 下一主题
本文实例讲述了PHP单例模式应用。分享给大家供大家参考,具体如下:
以前刚开始工作的时候经常连接数据库,每次用到数据库的时候就要用new举行实例并连接一次,当时因为连接数据库的次数不是很频繁,以是也没什么。厥后主管对我说我如今如许每次都连接数据库的如果数据读取频繁的话对数据库和系统造成的压力会很大,让我想想办法能不能就连接一次数据库然后再次用到的时候就不用new一个新的连接了,当时怎么也没想到好的办法,知道最近学到了单例模式才名顿开,当时主管是引导我用单例模式的,只怪我以前对开发模式不懂。好了废话少说,下面来看单例模式:
单例模式(职责模式):
简单的说,一个对象(在学习设计模式之前,需要比较相识面向对象思想)只负责一个特定的任务;
单例类:
1、构造函数需要标志为
  1. private
复制代码
(访问控制:防止外部代码利用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;
2、拥有一个生存类的实例的静态成员变量
3、拥有一个访问这个实例的公共的静态方法(常用
  1. getInstance()
复制代码
方法举行实例化单例类,通过
  1. instanceof
复制代码
操作符可以检测到类是否已经被实例化)
别的,需要创建
  1. __clone()
复制代码
方法防止对象被复制(克隆)
为什么要利用PHP单例模式?
1、php的应用主要在于数据库应用, 以是一个应用中会存在大量的数据库操作, 利用单例模式, 则可以克制大量的
  1. new
复制代码
操作斲丧的资源。
2、如果系统中需要有一个类来全局控制某些设置信息, 那么利用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部门。
3、在一次页面哀求中, 便于举行调试, 因为全部的代码(比方数据库操作类db)都会集在一个类中, 我们可以在类中设置钩子, 输出日志,从而克制随处
  1. var_dump
复制代码
,
  1. echo
复制代码

代码(官方文档中的):
  1. <?php
  2. class Singletons{
  3.   // 保存类实例在此属性中
  4.   private static $instance;
  5.   // 构造方法声明为private,防止直接创建对象
  6.   private function __construct()
  7.   {
  8.     echo 'Iam constructed';
  9.   }
  10.   // singleton 方法
  11.   public static function singleton()
  12.   {
  13.     if (!isset(self::$instance)) {
  14.       $c = __CLASS__;
  15.       self::$instance =new$c;
  16.     }
  17.     return self::$instance;
  18.   }
  19.   // Example类中的普通方法
  20.   public function bark()
  21.   {
  22.     echo 'Woof!';
  23.   }
  24.   // 阻止用户复制对象实例
  25.   public function __clone()
  26.   {
  27.     trigger_error('Clone is not allowed.',E_USER_ERROR);
  28.   }
  29. }//endclass singletons
  30.   //这个写法会出错,因为构造方法被声明为private
  31.   //$test= new Singletons();
  32.   // 下面将得到Example类的单例对象
  33.   $test= Singletons::singleton();
  34.   $test->bark();
  35.   // 复制对象将导致一个E_USER_ERROR.
  36.   $test_clone= clone $test;
  37. ?>
复制代码
结果:
  1. I am constructed!   Woof!
  2. Fatal error:
  3. Clone is not allowed. in E:\APMServ5.2.6\www\htdocs\Lee\myprogram\other\class\singletons.phpon line 31
复制代码
以下内容源自网络(可以参考学习一下):
单例模式的三个要点:
(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). 必须提供一个访问这个实例的公共的静态方法(通常为
  1. 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单例模式我觉得只是针对单次页面级哀求时出现多个应用场景并需要共享同一对象资源时是非常故意义的。
2、单例模式在PHP中的应用场所:
(1)、应用步调与数据库交互
一个应用中会存在大量的数据库操作,好比过数据库句柄来连接数据库这一举动,利用单例模式可以克制大量的new操作,因为每一次
  1. 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相关内容感爱好的读者可查察本站专题:《php面向对象步调设计入门教程》、《PHP数组(Array)操作本领大全》、《PHP根本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作本领汇总》
希望本文所述对大家PHP步调设计有所资助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作