用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3992|回复: 9
收起左侧

[已解决] 请教单例模式

[复制链接]
发表于 2010-9-19 17:39:34 | 显示全部楼层 |阅读模式
自定义的library能以单例模式使用么?
我的自定义库构造函数需要打开一个非常大的文件,从其他开发语言上的经验来看,频繁的访问(开、关)文件系统,对性能不是啥好事。
所以,我想对该自定义类(库)进行单例化,只在第一次调用构造函数的时候才去打开文件,并始终保持开启状态不关闭。
发表于 2010-9-20 00:12:31 | 显示全部楼层
CI 里所有通过 load 装载的都是单例模式的。
 楼主| 发表于 2010-9-20 11:06:50 | 显示全部楼层
喔,感谢版主。
只是有点疑惑的是,我在构造函数中fopen然后在方法中fclose,下次竟然还能在方法中fread到数据。所以我以为不是单例的。可能是我没弄清楚php操作文件的内部机制
发表于 2010-9-20 11:21:15 | 显示全部楼层
“下次”,你指的是什么?下次请求?
 楼主| 发表于 2010-9-20 11:38:50 | 显示全部楼层
举例
在自定义类的构造函数中打开文件
$this->handler = fonen("xxxx.xx")
放在本类的成员变量中。

然后在一个业务方法a()中
$fd = $this->handler;
fread($fd)
用完以后fclose($fd)

按照单例思路,下一次通过$this->自定义类->a(),在进行fread($fd)的时候,应该会抛出异常才对(至少java是这样),因为上一次已经fclose($fd)了。
 楼主| 发表于 2010-9-20 11:42:03 | 显示全部楼层
本帖最后由 rosen 于 2010-9-20 11:54 编辑

又是另外一个话题,貌似$fd = $this->handler;是传值引用而不是传址?
貌似也不是这个问题,我直接在a()中使用$this->handler,然后对其进行fclose,下次还是照样能fread

但我又echo $this->handler,发现每次的资源id都没变化,说明的确只有一个实例.......
发表于 2010-9-20 14:33:10 | 显示全部楼层
你那样用的话不管单例什么事情的
 楼主| 发表于 2010-9-20 14:44:06 | 显示全部楼层
目前也没什么问题,先这样用吧。
发表于 2010-9-25 20:05:31 | 显示全部楼层
单例模式就是为了让程序运行期间始终只能存在一个当前类的引用(实例) 以达到某些控制的功能 常见的有数据库连接池等等 要想实现单例模式 首先将类的构造方法私有化 然后提供一个全局的方法返回对象的唯一实例
PHP复制代码
 
<?php
class A
{
 private static $_ins=null;
 private function A(){}
 public static function getInstance()
 {
  if(!(self::$_ins instanceof self))
   self::$_ins=new self;
  return self::$_ins;
 }
}
?>
复制代码
发表于 2010-9-25 20:08:53 | 显示全部楼层
ez.rar (191.95 KB, 下载次数: 19) 给你个参考文件 是我写的一个开发框架 里面大量运用了单例模式MVC http://code.google.com/p/ezmvc

本版积分规则