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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 首先我们看一个这样的应用场景: 我们打开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
相关文章
|
3天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
|
1天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性
设计模式在PHP开发中至关重要,如单例模式确保类仅有一个实例并提供全局访问点,适用于管理数据库连接或日志记录。工厂模式封装对象创建过程,降低系统耦合度;策略模式定义算法系列并使其可互换,便于实现不同算法间的切换。合理选择设计模式需基于需求分析,考虑系统架构,并通过测试驱动开发验证有效性,确保团队协作一致性和代码持续优化。设计模式能显著提升代码质量,解决开发中的设计难题。
18 8
|
5天前
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
22 11
|
1天前
|
设计模式 存储 缓存
PHP中的设计模式:单例模式的深入解析
在PHP开发中,设计模式是提高代码可维护性、扩展性和重用性的关键技术之一。本文将深入探讨PHP中的单例模式,包括其定义、实现方式、应用场景以及优缺点。通过对单例模式的全面剖析,帮助开发者更好地理解和应用这一设计模式,从而编写出更加高效和优雅的PHP代码。
|
4天前
|
设计模式 数据管理 测试技术
PHP中的设计模式:单一职责原则在实战项目中的应用
在软件开发中,设计模式是解决问题的最佳实践。本文通过分析单一职责原则(SRP),探讨了如何运用这一原则来提升PHP项目的可维护性和扩展性。我们将从实际案例出发,展示单一职责原则在业务逻辑分离、代码解耦和提高测试效率方面的应用。无论是新手还是经验丰富的开发者,都能从中获益,进而编写出更健壮、更灵活的PHP代码。
|
1天前
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的可维护性与扩展性
在软件开发中,设计模式是一套经过验证的解决特定问题的模板。对于使用PHP语言的开发者来说,合理运用设计模式不仅可以优化代码结构,还能显著提高项目的可维护性和扩展性。本文将探讨几种常见的设计模式及其在PHP中的应用,帮助开发者编写更高效、更灵活的代码。
|
4天前
|
设计模式 安全 PHP
PHP中的设计模式:单一职责原则在实战中的应用
在软件开发中,设计模式是解决常见问题的成熟方案。本文将通过分析单一职责原则这一设计原则,探讨如何在PHP应用程序中应用这一原则来提高代码的可维护性、扩展性和灵活性。我们将从实际案例出发,展示单一职责原则的具体应用方法,并解释其对项目开发周期和质量的积极影响。无论你是PHP初学者还是经验丰富的开发者,都能从中获益,提升你的编程实践水平。
|
1天前
|
设计模式 安全 Java
设计模式--单例模式Singleton
这篇文章详细介绍了单例模式Singleton的八种实现方式,包括饿汉式(静态常量和静态代码块)、懒汉式(线程不安全和线程安全的同步方法、同步代码块)、双重检查、静态内部类和枚举。每种方式都有详细的代码示例和优缺点说明,帮助理解单例模式的应用和选择适合的实现方法。
设计模式--单例模式Singleton
|
1天前
|
设计模式 自然语言处理 算法
PHP中的设计模式:桥接模式的深入探索与应用
在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
8 1
|
1天前
|
设计模式 算法 搜索推荐
PHP中的设计模式:提高代码可维护性的秘诀
在本文中,我们将探讨PHP设计模式的重要性以及它们如何帮助开发者编写出更加灵活、可维护的代码。我们将介绍几种常见的设计模式,包括单例模式、工厂模式和策略模式,并通过实际示例展示它们在PHP中的应用。最后,我们会讨论何时使用这些设计模式以及在实际项目开发中的最佳实践。
8 1