single单例模式
单例模式:多用于数据库连接,保证数据库只连接一次,避免重复连接。因为多次打开服务器会造成服务器负担,运行速度会减慢。
以下是一个连接数据库的单例模式:
<?php
class db_mysql{// 单例中包含三个私有属性(一个静态变量,一个构造函数,一个克隆方法),一个公共静态方法。三私一公
private static $instance;// 用来存储数据库连接
private $pdo;
private function __construct(){// 私有构造函数,定义成private型,防止外部实例化对象
//echo 11;
$this->con("my_blog","root","123456");//连接数据库
}
private function __clone(){
//定义成私有的是防止对象被克隆,克隆是可以改变参数。如果$db4=$db;这是赋值操作,不能改变参数
echo 22;
}
private function con($dbname,$username,$password){//数据库连接,三种方式:mysql_connet mysqli pdo
try {
$this->pdo=new PDO("mysql:host=localhost;dbname=$dbname",$username,$password);// 创建pdo连接对象
echo "连接成功";
} catch (PDOException $ex) {
echo $ex->getMessage();
}
}
public static function getinstance(){
if(!(self::$instance instanceof self)){// self代表自身(本身是一个对象),判断$instance的值属不属于这个对象,
self::$instance=new self;// self代表 db_mysql
}
return self::$instance;
}
public function insert($data){// 添加功能
if(!is_array($data)){
return FALSE;
}
$fields= array_keys($data);
$val=array_values($data);
// var_dump($val);//数组
$str=array_walk($val,array($this,'parsestr'));// 通过循环方式,循环数组中的每一个值
//foreach($val as $k=>$v){$val[$k]=parsestr($v)};
//array_walk 相当于一个while循环,array($this,'')是一个数组,parsestr是一个回调函数
// echo "<pre>";
// var_dump($val);//数组
$str=implode(",", $val);
// echo "<br>";
// echo "<pre>";
// echo $str;
$fields= implode(",", $fields);
$sql="insert into fruit ($fields) values ($str) ";
echo $sql;
echo "<br>";
$num=$this->pdo->exec($sql);
echo $num;
echo "<br>";
$id= $this->pdo->lastInsertId();
echo $id;
}
public function getlist($fileds,$table,$condition){//$fileds 字段 $table表名 $condition 查询条件
if(!is_array($condition)){
return FALSE;
}
$where="1=1";
foreach ($condition as $key => $val){
$where .=" and $key ='".$val."'";
}
$sql="select ".$fileds." from ".$table." where ".$where;
$result=$this->pdo->query($sql);
if($result){//判断$result,是否有值
return $result->fetchall(PDO::FETCH_ASSOC);
}
} public function parsestr(&$val){//引用
$val= "'".$val."'";// $val[$k]=
// echo "<pre>";
// echo $val;//字符串
} }
//$b=new db_mysql();
$db= db_mysql::getinstance();
echo "<br>";
//$db2= db_mysql::getinstance();
echo "<br>";
//$db3= clone $db;//克隆
$db->insert(['fruit_name'=>'葡萄','supplier_id'=>2]);
echo "<br>";
$a=$db->getlist("*",'fruit',array('fruit_name'=>'苹果'));
echo "<br>";
echo "<pre>";
var_dump($a);
连接数据库的方法中用:try{
}catch(){
}
捕获异常
13 private function con($dbname,$username,$password){//数据库连接,三种方式:mysql_connet mysqli pdo
14 try {
15 $this->pdo=new PDO("mysql:host=localhost;dbname=$dbname",$username,$password);// 创建pdo连接对象
16 echo "连接成功";
17 } catch (PDOException $ex) {
18 echo $ex->getMessage();
19 }
20 }
single单例模式的更多相关文章
- 7.JAVA基础复习——JAVA中的设计模式单例模式
设计模式:是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 总体来说设计模式分为23种三大类: 创建型模式,共 ...
- java基础学习之单例设计模式学习
最近狂补java基础的我重新学习了下单例,下面直接贴出代码,以作备忘 package com.darling.single; /** * 单例模式 * 单例即在内存中只存在该类的一个实例,要想实现这个 ...
- WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)
今天学习WCF分布式开发步步为赢系列的15节:错误契约(FaultContract)与异常处理(ExceptionHandle).本节内容作为WCF分布式开发的一个重要知识点,无论在学习还是项目中都应 ...
- wcf必知必会以及与Webapi的区别
快速阅读 介绍wcf中的信息交换模式MEP以及数据在传输过程中的序列化,endpont的介绍和wcf的三种实例模式以及安全模式 以及和Webapi的简单对比. wcf介绍 支持跨平台. 支持多种协议 ...
- 第1章 单例模式(Single Pattern)
原文 第1章 单例模式(Single Pattern) 单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 一.常用模式: 1 ...
- 创建型模式篇(单例模式Single Pattern)
一.单例模式(Singleton Pattern) 单例模式要求一个类只能有一个实例,并且提供了一个全局的访问点. 比如说,中国主席的职位是Singleton,法律规定主席选举,任何时间只能有一个主席 ...
- Single Pattern(单例模式)
单例模式是一种常用的软件设计模式.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的实例只能存在一个,单例模式是最好的 ...
- c# 单例模式(Single);单例模式的5种写法
单例模式(Singleton Pattern): 在平时的开发中,可能会用到单例模式,许多java的笔试题中也会叫笔试者写出单例模式的那几种写法并且分析.那么下面就来轻轻地探讨一下,最简单的设计模式, ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
随机推荐
- iframe父页面获取子页面的高度
最近做项目中用到了iframe,子页面更改父页面的高度,经过九九八十一难,找到了解决的办法. $(window).load(function() { var h=$(document).height ...
- abap 字符串处理
1).SHIFT:截断字符串 SHIFT {c} [BY {n} PLACES] [{mode}].: 作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则 ...
- 为Autodesk Viewer添加自定义工具条的更好方法
上一篇文章中我介绍了使用Autodesk Viewer的UI API来给viewer添加自定义工具条的方法,看起来很简单是吧.不过有个问题,就是关于自定义工具条的信息(包括按钮的文本.图标.样式.ca ...
- ECMAScript对文件夹图片幻灯片播放
代码如下: var curContext = null; var curWeb = null; var picListTitle = "PictureLib"; var folde ...
- SqlIte数据库并发性
把遇到的一些小问题都记下来,告诉自己,一些小细节会铸成打错的 今天没事复习以前的知识,用sqlite做数据库,发现修改数据的时候等好久才有反应,而且还失败,可是过一会之后又会好,好了以后又是一样,种以 ...
- asp.net实现动态添加table行
asp.net动态的生成,删除table的行,主要是在后台动态创建单元行,单元表格,效果图: 2.代码: <%@ Page Language="C#" AutoEventWi ...
- 访问其他程序的SheardPreferents
程序A: SharedPreferences preferences=getSharedPreferences("myPreferences", Context.MODE_WORL ...
- Angularjs之如何在跨域请求中传输Cookie
一般情况我们在使用WebApi之类的技术时,都会遇到跨域的问题,这个只需要在服务端做一下处理即可. 如果这些GET或POST请求不需要传递Cookie数据的话,就没什么问题了,但如果需要,那么会发现 ...
- 0018 Java学习笔记-面向对象-类的基本要素
类与对象 大街上一个个的人,就是一个个对象 类是对一群对象的抽象,比如人都有性别.年龄.姓名,都会吃饭.睡觉等.姓名性别可以抽象为变量,吃饭睡觉可以抽象为方法,像下面一样定义个类来形容人 public ...
- SQL SERVER同步环境新增发布对象时不能生成(sp_MS+表名)同步存储过程
在配置了同步的用户环境(订阅端:请求订阅) 在发布端: 1.企业管理器SSMS—复制—本地发布—发布属性—项目(选中发布对象) 2.在企业管理里—查看快照代理状态(启动) 在订阅服务器: USE [D ...