PHP设计模式之——单例模式

首先我们看一个这样的应用场景:

我们打开jd.com京东商城的官网首页,我们看到很多商城里的数据。我们知道页面的数据来源于数据库(亦或是缓存),从页面而看,数据分成了不同的模块,如下图。




那么问题来了,不同模块的数据,是怎么通过一个请求资源来请求的呢?换句话说,如果每一个sql都要执行一次数据库连接,这将会是很多次连接,那么是怎么做到一个请求使用一个连接来处理的呢?

有几种处理方式,java和.Net(C#)等这样编译型的语言,可以在编译后,把连接作为内存常驻的资源,这样请求来了的时候,可以使用内存中使用的唯一连接资源;也有连接池这样的方式,将很多的连接资源放到一个公共的连接池当中,当有需要的时候从中取出一个来进行业务处理。对于PHP这样的解释型语言的页面级请求来说,页面请求结束,PHP进程运行完成以后会释放所有资源,而新的请求进来还会再次创建局部与全局变量,也就是在一次请求中连接需要作为唯一资源。以上几种方式,都需要将连接作为唯一的一个实例来处理,也就是——单例模式。


什么是单例?

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

单例模式有三个条件:

1,需要保存类唯一实例的静态成员变量

2,构造函数和析构函数声明以及clone为私有,防止外部能够new这个类或者克隆唯一实例,而失去单例的意义

3,要有一个公用的访问这个实例的静态方法


什么时候要用到单例模式呢?

1,应用程序与数据库或者缓存进行交互

2,控制配置信息


如何实现单例呢?

话不多说,直接上代码

<?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>";  



已标记关键词 清除标记
相关推荐
课程简介: 历经半个多月的时间,Debug亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强实践性质的“项目实战”课程,即“企业应用员工角色权限管理平台”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜以及其他实体模块的管理;其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页