为什么要使用PHP单例模式及应用实例+PHP设计模式笔记:使用PHP实现单例模式

jackxiang 2013-3-18 18:03 | |
背景:在以前初始化一个数据库句柄:

为何都这样写单例模式?层层分析:
http://www.cnblogs.com/hongfei/archive/2012/07/07/2580994.html


——————————————————————————————————————
上面Url里提到各种调用调不了,出问题的一个小小总结如下,也有总结不对的,说是静态函数被类调用不需要执行析构函数是不对的,执行了,但没有创建对象是真:
在php中,访问类的方法/变量有两种方法:
1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/function,前提是该变量/方法可访问。
2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以。但是有前提条件:
A. 如果是变量,需要该变量可访问。
B. 如果是方法,除了该方法可访问外,还需要满足:
b1) 如果是静态方法,没有特殊条件;
b2) 如果是非静态方法,需要改方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题。

然后我们再看一下使用$object->… 和使用class::… 都有什么区别:
1. 使用$object->… ,需要执行构造函数创建对象;
2. 使用class::… 调用静态方法/变量,不需要执行构造函数创建对象;
3. 使用class::… 调用非静态方法/变量,也不需要执行构造函数创建对象。

然后奇怪的地方就出来了,既然2和3都一样,那静态方法/变量存在还有什么意义呢?
差异还是显然存在的,如下:
1. 静态变量
静态成员只保留一个变量值,而这个变量值对所有的实例都是有效,也就是说,所有的实例共享这个成员。
2. 静态方法
静态方法可以直接使用class::… 来调用,而非静态方法需要满足一定限制条件才能使用class::.. 的方法调用,如之前所述

来自:http://www.jb51.net/article/29717.htm

这时我们不得不重新初始化一个数据库句柄,试想多个应用场景下,这样的代码是多么可怕啊?!

有些朋友或许会说,我也可以不这样做啊,我直接利用global关键字不就可以了吗?的确,global可以解决问题,也起到了单例模式的作用,但是 OOP中,我们拒绝这样来编写代码,因为global存在安全隐患,请参考相关书籍,同时单例模式恰恰是对全局变量的一种改进,避免了那些存储唯一实例的 全局变量污染命名空间
global $db;  //OOP中,我们不提倡这样编写代码
使用单例模式编码

如有的KO框架里写的读取配置文件:


单例方式:就是只需一个实例。作为对象的创建方式,单例方式确保某一个类只需一个实例,而且自行实例化并向整个零碎提供这个实例,这个类我们称之为单例类。

单例方式的要点有三个:
一是某个类只能有一个实例;
二是它必需自行创建这个实例;
三是它必需自行向整个零碎提供这个实例。
上面我们讨论下为什么要运用PHP单例方式?
多数人都是从单例方式的字面上的意思来理解它的用处, 以为这是对零碎资源的节省, 可以避免反复实例化, 是一种"方案生育".   而PHP每次执行完页面都是会从内存中清算掉一切的资源. 因而PHP中的单例理论每次运转都是需求重新实例化的, 这样就失掉了单例反复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位绝望. 但是单例仅仅只需这个功用和运用吗? 答案能否认的,我们一同来看看。
1. php的运用次要在于数据库运用, 所以一个运用中会存在大批的数据库操作, 在运用面向对象的方式开发时(废话), 假定运用单例方式, 则可以避免大批的new 操作耗费的资源。
2. 假定零碎中需求有一个类来全局控制某些配相信息, 那么运用单例方式可以很方便的完成. 这个可以参看zend Framework的FrontController部分。
3. 在一次页面央求中, 便于中止调试, 由于一切的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免四处var_dump, echo。
运用实例:






更多参考:彻底认清PHP单例模式的本质
http://blog.zol.com.cn/6211/article_6210156.html
更多模式:http://coolshell.cn/articles/8961.html
[PHP]单例模式遇上继承与重写:
http://hi.baidu.com/kenking2008/item/75c34af3e36b4aea1a111f70
php-可继承的单例模式例子-singleton:
http://www.xinze.me/php-%E5%8F%AF%E7%BB%A7%E6%89%BF%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E4%BE%8B%E5%AD%90-singleton/

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6140/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2015-1-5 15:02
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]