Zend框架中单例模式的实现

a610138467 2013-09-10 04:22:45
从书本上看到很多单例模式的使用用法,作用,但是实际遇到单例模式还是有些看不懂啊。
以下是我看到的Zend框架中Disaptcher中的一个单例模式相关的代码

public static function getInstance() {
if (self::$_objSelf instanceof self) {
TT('have');
return self::$_objSelf;
} else {
TT('no have');
TT(self::$_objSelf);
self::$_objSelf = new self(self::$_arrOption);
return self::$_objSelf;
}
}

在配置里面有一个首页index,里面有语句

$objDisaptcher=Crab_Controller_Disaptcher::getInstance();

也就是调用上面的代码。
对于请求如 www.test.com/?module=XXX&controller=XXX&action=XXX的请求都会通过上面的类分发。
我的问题 这里的单例模式是如何实现的。以下是我的理解
我每发送一个上面的类似请求,服务器收到请求将请求发给Index,此时每一个请求应该是一个线程?
那么该线程会去请求单例模式中的getInstance然后把该单例写到静态变量$_objSelf中去。

protect static $_objSelf

那么如果又来了一个请求调用这段代码,岂不是要用了同一个对象。(因为if(self::$_objUser)这个判断)
那么这样肯定会造成请求冲突啊。
当然了实际情况时每次都会生成一个新的单例,(我用调试输出了下每次请求都新生成一个对象)
请问为什么每次请求会输出一个对象?上次请求不是已经把该对象存到静态对象中了吗?php里面的静态对象不应该是所有对象公用的么。还是我的理解有问题?
...全文
1747 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a610138467 2013-09-14
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
php里面的静态对象是所有对象公用的 但只对当前程序进程有效 单例模式与工作流程没有直接关系 像你示例的代码并无所谓单例的需求,因为他只是程序的入口 适合单例模式的场景是,你有一些复杂的数据,需要经过不同的类进行加工 就好比流水线,单例模式的对象被放置在传送带上,各个工位都只对其一部分进行加工
也就是说在apache里面对于每一个请求都是一个进程而不是一个线程对吗?
memory_qian 2013-09-13
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
php里面的静态对象是所有对象公用的 但只对当前程序进程有效 单例模式与工作流程没有直接关系 像你示例的代码并无所谓单例的需求,因为他只是程序的入口 适合单例模式的场景是,你有一些复杂的数据,需要经过不同的类进行加工 就好比流水线,单例模式的对象被放置在传送带上,各个工位都只对其一部分进行加工
+++++++++++++
xuzuning 2013-09-10
  • 打赏
  • 举报
回复
php里面的静态对象是所有对象公用的 但只对当前程序进程有效 单例模式与工作流程没有直接关系 像你示例的代码并无所谓单例的需求,因为他只是程序的入口 适合单例模式的场景是,你有一些复杂的数据,需要经过不同的类进行加工 就好比流水线,单例模式的对象被放置在传送带上,各个工位都只对其一部分进行加工

4,251

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧