我有一个与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
一次。
有没有办法做到这一点,还是应该使用全局变量?
答案 0 :(得分:9)
我会使用单例模式编写另一个类来获取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, ...)
...
答案 1 :(得分:5)
传入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);
等
答案 2 :(得分:2)
我认为你在这里寻找静态属性。
class mc {
private static $instance;
public static function getInstance() {
if (self::$instance== null) {
self::$instance= new self;
}
return self::$instance;
}
private function __construct() {
$this->mem = memcache_connect(...);
}
}
这实现了一个基本的单例模式。而不是构建对象调用mc::getInstance()
。看看singletons。
答案 3 :(得分:1)
您应该使用依赖注入。单例模式和静态结构被认为是不好的做法,因为它们本质上是全局的(并且有充分的理由 - 它们会限制你使用你实例化的任何类而不是其他类)。
这就像你应该做的那样,以便于维护。
class MemCache {
protected $memcache;
public function __construct(){
$this->memcache = memcache_connect();
}
}
class Client {
protected $MemCache;
public function __construct( MemCache $MemCache ){
$this->MemCache = $MemCache;
}
public function getMemCache(){
return $this->MemCache;
}
}
$MemCache = new MemCache();
$Client = new Client($MemCache);
$MemCache1 = $Client->getMemCache();
// $MemCache and $MemCache1 are the same object.
// memcache_connect() has not been called more than once.