zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

2023-09-14 09:02:06 时间

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

我们打开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= echo $db- delete(demo,array(id= 2)); db::getLastSql(); echo " pre




php设计模式-简单工厂模式 (Simple Factory) 简单工厂模式又称为静态工厂方法模型,它属于类创建型模式,简单工厂并不属于23种设计模式,刚开始学习设计模式的同学,对简单工厂模式、工厂方法、抽象工厂中的工厂一知半解,其实白话点来说:这些模式一定会有一个工厂类,子类并不需要知道工厂细节,只需新建工厂创建产品即好。