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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 首先我们看一个这样的应用场景: 我们打开jd.com京东商城的官网首页,我们看到很多商城里的数据。我们知道页面的数据来源于数据库(亦或是缓存),从页面而看,数据分成了不同的模块,如下图。 那么问题来了,不同模块的数据,是怎么通过一个请求资源来请求的呢?换句话说,如果每一个sql都要执行一次数据库连接,这将会是很多次连接,那么是怎么做到一个请求使用一个连接来处理的呢? 有几

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

我们打开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>";  



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
30 2
|
11天前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
|
16天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
21 2
|
1月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
36 4
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
1月前
|
设计模式 缓存 数据库连接
深入理解PHP的面向对象编程与设计模式####
本文旨在通过实例解析PHP中面向对象编程的核心概念及其在实际开发中的应用,特别是单例模式、工厂模式和观察者模式等常见设计模式。文章将展示这些模式如何帮助开发者构建更加灵活、可维护的代码结构,以及它们在解决具体问题时的优势。 ####
|
22天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
1月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
20 1
|
2月前
|
设计模式 监控 中间件
深入理解PHP中的中间件模式
【10月更文挑战第20天】探索PHP编程世界中的“交通枢纽”——中间件模式。从代码层面剖析如何实现请求和响应的高效管理,以及如何在开发中应用这一模式来增强项目的扩展性和维护性。
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
27 0