我有一个与memcache服务器交互的类.我有不同的功能来插入,删除和检索数据.最初每个函数都调用了memcache_connect()
,但这是不必要的,例如:
mc->insert() mc->get() mc->delete()
会做三个memcache连接.我通过为类创建一个构造来解决这个问题:
function __construct() { $this->mem = memcache_connect( ... ); }
然后$this->mem
在需要资源的任何地方使用,因此三个函数中的每一个都使用相同的memcache_connect
资源.
这没关系,但是如果我在其他类中调用类,例如:
class abc { function __construct() { $this->mc = new cache_class; } } class def { function __construct() { $this->mc = new cache_class; } }
然后memcache_connect
,当它只需要一个时,它仍然会进行两次调用.
我可以用全局变量做到这一点,但如果我不需要,我宁愿不使用它们.
示例全局实现:
$resource = memcache_connect( ... ); class cache_class { function insert() { global $resource; memcache_set( $resource , ... ); } function get() { global $resource; return memcache_get( $resource , ... ); } }
然后,无论班级被叫多少次,都只会有一次打电话memcache_connect
.
有没有办法做到这一点,还是我应该使用全局变量?
我会使用单例模式编写另一个类来获取memcache的唯一实例.像这样 -
class MemCache { private static $instance = false; private function __construct() {} public static function getInstance() { if(self::$instance === false) { self::$instance = memcache_connect(); } return self::$instance; } }
和用法 -
$mc = MemCache::getInstance(); memcache_get($mc, ...) ...
传入MC实例:
class abc { function __construct($mc) { $this->mc = $mc; } } class def { function __construct($mc) { $this->mc = $mc; } } $mc = new cache_class; $abc = new abc($mc);
等等