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种设计模式,刚开始学习设计模式的同学,对简单工厂模式、工厂方法、抽象工厂中的工厂一知半解,其实白话点来说:这些模式一定会有一个工厂类,子类并不需要知道工厂细节,只需新建工厂创建产品即好。
相关文章
- php 组合模式
- php 观察者模式
- PHP安装模式cgi、fastcgi、php_mod比较
- Linux下的Apache和PHP安全设置,如何开启PHP的安全模式
- php中preg_match用户名正则实例
- 深入PHP中慎用双等于(==)的详解
- PHP设计模式系列 - 观察者模式处理订单(异步操作附加功能)
- 【PHP 】伪静态 - 4. 实际运用
- PHP CI框架下,如果配置NGINX(根目录和子目录两种模式)
- PHP 实现适配器(Adapter)模式
- PHP实现简易的模板引擎
- thinkphp6:访问redis6(thinkphp 6.0.9/php 8.0.14)
- linux(ubuntu 20.10):安装composer 2.0.8及thinkphp 6.0.5(php 7.4.9)
- [转]php的public、protected、private三种访问控制模式的区别
- Atitit 发送post http 功能总结目录1. 常见三种模式 Form-data Form-urlencode Raw 12. Php code 12.1. urlencode
- paip.截取字符串byLastDot方法总结uapi python java php c# 总结
- phpenv:PHP多版本安装和管理工具
- php工厂方法模式
- php简单工厂模式
- PHP - pcntl_fork() 执行过程详解
- PHP设计模式-策略模式 转
- php 单例模式