single单例模式
Posted 李昊宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了single单例模式相关的知识,希望对你有一定的参考价值。
单例模式:多用于数据库连接,保证数据库只连接一次,避免重复连接。因为多次打开服务器会造成服务器负担,运行速度会减慢。
以下是一个连接数据库的单例模式:
1 <?php 2 class db_mysql{// 单例中包含三个私有属性(一个静态变量,一个构造函数,一个克隆方法),一个公共静态方法。三私一公 3 private static $instance;// 用来存储数据库连接 4 private $pdo; 5 private function __construct(){// 私有构造函数,定义成private型,防止外部实例化对象 6 //echo 11; 7 $this->con("my_blog","root","123456");//连接数据库 8 } 9 private function __clone(){ 10 //定义成私有的是防止对象被克隆,克隆是可以改变参数。如果$db4=$db;这是赋值操作,不能改变参数 11 echo 22; 12 } 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 } 21 public static function getinstance(){ 22 if(!(self::$instance instanceof self)){// self代表自身(本身是一个对象),判断$instance的值属不属于这个对象, 23 self::$instance=new self;// self代表 db_mysql 24 } 25 return self::$instance; 26 } 27 public function insert($data){// 添加功能 28 if(!is_array($data)){ 29 return FALSE; 30 } 31 $fields= array_keys($data); 32 $val=array_values($data); 33 // var_dump($val);//数组 34 $str=array_walk($val,array($this,‘parsestr‘));// 通过循环方式,循环数组中的每一个值 35 //foreach($val as $k=>$v){$val[$k]=parsestr($v)}; 36 //array_walk 相当于一个while循环,array($this,‘‘)是一个数组,parsestr是一个回调函数 37 // echo "<pre>"; 38 // var_dump($val);//数组 39 $str=implode(",", $val); 40 // echo "<br>"; 41 // echo "<pre>"; 42 // echo $str; 43 $fields= implode(",", $fields); 44 $sql="insert into fruit ($fields) values ($str) "; 45 echo $sql; 46 echo "<br>"; 47 $num=$this->pdo->exec($sql); 48 echo $num; 49 echo "<br>"; 50 $id= $this->pdo->lastInsertId(); 51 echo $id; 52 } 53 public function getlist($fileds,$table,$condition){//$fileds 字段 $table表名 $condition 查询条件 54 if(!is_array($condition)){ 55 return FALSE; 56 } 57 $where="1=1"; 58 foreach ($condition as $key => $val){ 59 $where .=" and $key =‘".$val."‘"; 60 } 61 $sql="select ".$fileds." from ".$table." where ".$where; 62 $result=$this->pdo->query($sql); 63 if($result){//判断$result,是否有值 64 return $result->fetchall(PDO::FETCH_ASSOC); 65 } 66 } 67 68 public function parsestr(&$val){//引用 69 $val= "‘".$val."‘";// $val[$k]= 70 // echo "<pre>"; 71 // echo $val;//字符串 72 } 73 74 } 75 //$b=new db_mysql(); 76 $db= db_mysql::getinstance(); 77 echo "<br>"; 78 //$db2= db_mysql::getinstance(); 79 echo "<br>"; 80 //$db3= clone $db;//克隆 81 $db->insert([‘fruit_name‘=>‘葡萄‘,‘supplier_id‘=>2]); 82 echo "<br>"; 83 $a=$db->getlist("*",‘fruit‘,array(‘fruit_name‘=>‘苹果‘)); 84 echo "<br>"; 85 echo "<pre>"; 86 var_dump($a);
连接数据库的方法中用:try{
}catch(){
}
捕获异常
1 13 private function con($dbname,$username,$password){//数据库连接,三种方式:mysql_connet mysqli pdo 2 14 try { 3 15 $this->pdo=new PDO("mysql:host=localhost;dbname=$dbname",$username,$password);// 创建pdo连接对象 4 16 echo "连接成功"; 5 17 } catch (PDOException $ex) { 6 18 echo $ex->getMessage(); 7 19 } 8 20 }
以上是关于single单例模式的主要内容,如果未能解决你的问题,请参考以下文章