以前在
dbconfig.php
写PDO
连接数据库操作,用$db = new pdo()
,然后model
层其他文件include_once('dbconfig.php')
就可以使用PDO
实例对象$db
的各种方法和异常处理类了。
其实呢,目前我完全理解的看,这样之前存在两个大问题。第一,代码停留在
php4
面向过程的水平,不是把操作写到一个文件或者函数去调用就叫面向对象!!!!这一点我现在特别感谢魏振华老师,一学期她教的几乎都是纯理念的C++面相过程,回想起来讲的非常好,特别有用。第二个问题就是,每次
include
都会new
一个PDO
对象,由于这种蹩脚的代码没加命名空间,即使每次实例化对象赋值给同样的变量名也可以使用。但重点在于,每次开辟空间对内存I/O
读写影响很大,于是就有了一次结婚,终生幸福的设计模式:这里稍微说工厂模式和单例模式,请尽量保证你理解面向对象语言特性(这里的设计模式并不是针对php!!!)。
刚才那个例子,不同文件里每次你要操作数据库,都要实例化一个对象,很恶心。就像每次开房都要省下几百块吃饭和打游戏的钱,我们也可以想办法去网吧去
KTV
玩玩嘛。一般我们是每次需要操作数据库就连接,工厂模式就是每次先引入配置好的dbconfig.php
,不管你是啥后台文件,反正model
层你基本都要和数据库搞关系,我全部都引进来再说。这样可以少写一点代码,暑假有人告诉我这就是封装代码到一个文件。我信了,确实这是封装,镜像自制还能叫封装呢!!!这个封装和面向对象的封装性其实并不是一个概念!起码
dbconfig.php
这破文件谁都能访问就不符合。然后为了防止I/O
开销,我们引入了单例模式,这又是啥意思?举个例子吧,作为单身汪的你每周都要发泄一下,有时候去某店发泄,有时候你去网吧发泄,有时候去
KTV
发泄,都要钱都很贵啊!然后你就学会了一卡通,学校所有地方都允许你发泄,学校借给你一些东西的使用权,你还得还回去,并且你每次都要走同一条路去发泄了,这就是单例模式:创建一个唯一单例入口,有请求过来就判断单例对象是否存在,存在就返回,不存在则创建。创建是个实例化的过程,内存开销比较大,但是如果一次创建后让这个对象停留在静态存储区static
的话,后续就可以直接获取。
在代码上理解会更方便些:
configdb.php
文件里,BD class
里面有构造函数,保护属性$db
,还有个私有方法connectDB()
,里面实现了new PDO
操作,return $db
,但是在类外是不能直接调用私有方法滴,怎么破呢?魏老师的学生绝对能回答出来,这个做法就是单例模式,能看到这里的,请回答一下:(答案就是两个单词,共六个字母)。
- get and set。