本文共 2178 字,大约阅读时间需要 7 分钟。
首先我们明确单例模式这个概念,正如其名称一样,单例模式是指整个应用(呵呵,你可能会问什么应用阿?还是有些抽象,别急,下面我们会举例说明)中类只有一个对象实例的的设计模式。 PHP的一个主要应用场合就是应用程序与数据库打交道的应用场景,所以一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。 还是有些抽象,给出代码片段。 使用传统方式编码01 | <?php |
02 | ...... |
03 | //初始化一个数据库句柄 |
04 | $db = new DB(...); |
05 | //比如有个应用场景是添加一条用户信息: |
06 | $db ->addUserInfo(); |
07 | ...... |
08 | //然而我们在另外一个地方可能要查找用户的信息,这个情景出现在一个函数中,这时要用到数据库句柄资源,我们可能需要这么去做 |
09 | ...... |
10 | function test(){ |
11 | ...... |
12 | //这时我们不得不重新初始化一个数据库句柄,试想多个应用场景下,这样的代码是多么可怕啊?! |
13 | $db = new DB(...); |
14 | $db ->getUserInfo(); |
15 | ...... |
16 | //有些朋友或许会说,我也可以不这样做啊,我直接利用global关键字不就可以了吗?的确,global可以解决问题,也起到了单例模式的作用,但是OOP中,我们拒绝这样来编写代码,因为global存在安全隐患,请参考相关书籍,同时单例模式恰恰是对全局变量的一种改进,避免了那些存储唯一实例的全局变量污染命名空间 |
17 | global $db ; //OOP中,我们不提倡这样编写代码 |
18 | ...... |
19 | } |
1 | <?php |
2 | ...... |
3 | //所有的应用情景只有一个数据库句柄资源,嘿嘿,效率老高了, |
4 | //资源也大大的得到节省,代码简洁明了:) |
5 | DB::getInstance()->addUserInfo(); |
6 | DB::getInstance()->getUserInfo(); |
7 | ...... |
01 | <?php |
02 | /** |
03 | * PHP单例模式演示举例 |
04 | * @author guohua.li |
05 | * @modify 2010-07-11 |
06 | * @website |
07 | */ |
08 | class User{ |
09 | /** |
10 | * 静态成品变量 保存全局实例 |
11 | * @access private |
12 | */ |
13 | static private $_instance = NULL; |
14 | /** |
15 | * 私有化构造函数,防止外界实例化对象 |
16 | */ |
17 | private function __construct() {} |
18 | /** |
19 | * 私有化克隆函数,防止外界克隆对象 |
20 | */ |
21 | private function __clone(){} |
22 | /** |
23 | * 静态方法, 单例统一访问入口 |
24 | * @return object 返回对象的唯一实例 |
25 | */ |
26 | static public function getInstance() { |
27 | if ( is_null (self:: $_instance ) || !isset(self:: $_instance )) { |
28 | self:: $_instance = new self(); |
29 | } |
30 | return self:: $_instance ; |
31 | } |
32 | /** |
33 | * 测试方法: 获取用户名字 |
34 | */ |
35 | public function getName() { |
36 | echo 'hello liguohua!' ; |
37 | } |
38 | } |
转载地址:http://afadi.baihongyu.com/