Dai Chong's blog

本篇介绍一下php的单例模式以及PDO连接数据库的方法。

说到’单例模式‘php基础比较扎实的童鞋肯定不陌生,但像本人这样的程序猿基础不是很好的可能只是有些印象而已。

那么’单例模式‘到底是什么呢?

他其实是php框架底层比较常用的一种设计模式,例如’工厂模式‘、’注册树模式‘、’策略模式‘以及’观察者模式‘等等,都是php各大框架底层架构的核心所在!

所谓的’单例模式‘说白了其实就是’三私有,一公有‘。

’三私有‘:一个私有变量作为实例化对象存储,两个私有方法’clone‘防止克隆对象以及’construct‘。

’一公有‘:一个共有的方法用来检测和实例化类。

下面是代码:

[单例类]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php 
header("Content-Type: text/html;charset=utf-8");
//单例
class Uni{
//创建静态私有的变量保存该类对象
private static $instance;
//防止直接创建对象
private function __construct(){
}
//防止克隆对象
private function __clone(){

}
public static function getInstance(){
//判断$instance是否是Uni的对象
//没有则创建
if (!self::$instance) {
//实例化本类对象 传入参数,实例化类会执行构造函数
self::$instance = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
}
return self::$instance;
}
//查询多条数据
public static function get_all($sql,$type=1){
try {
if($type==1){
//缓冲查询
$data = self::getInstance()->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}else{
//非缓冲查询
$uresult = self::getInstance()->query($sql);
if ($uresult) {
while ($data[] = $uresult->fetch(PDO::FETCH_ASSOC)) {}
}
}
return $data;
} catch (Exception $e) {
return '查询错误'.$e;
}
}
//查询单条数据
public static function get_one($sql){
try {
$data = self::getInstance()->query($sql)->fetch(PDO::FETCH_ASSOC);
return $data;
} catch (Exception $e) {
return '查询错误'.$e;
}
}
//查询单个字段
public static function get_field($sql,$field){
try {
$data = self::getInstance()->query($sql)->fetch(PDO::FETCH_ASSOC);
return $data[$field];
} catch (Exception $e) {
return '查询错误'.$e;
}
}
}

看到这里有的童鞋可能还会有些疑问:”这些代码到底是能起到什么作用呢?“,下面就为大家演示一下这个单例类到底是干什么用的。

[演示代码]
1
2
3
4
5
6
7
8
9
10
public static function getInstance(){
//判断$instance是否是Uni的对象
//没有则创建
if (!self::$instance) { // 这里在往上看到有的人是用 instanceof self 来判断的,大同小异。
echo 1;
//实例化本类对象 传入参数,实例化类会执行构造函数
self::$instance = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
}
return self::$instance;
}

我们再连接数据库这里输出一个 1,然后调用一下这个方法:

[调用方法]
1
2
Uni::getInstance();
//1

我们会发现页面上输出了一个 ’1‘,这是没问题的。

接下来我们写一个循环:

[循环调用]
1
2
3
4
for ($i=0; $i <10; $i++) { 
Uni::getInstance();
}
//1

到这我们会发现页面上输出的还是一个 ’1‘,说明我们多次调用这个类,但只连接了一次数据库。如果没有这个单例类,我们可能每次的查询都去连接数据库,过多的连接会导致数据库崩溃。

所以这个单例模式还是很重要的。

大家学到了吗?


 评论