在PHP中的函数之间共享变量而不使用全局变量

时间:2009-02-15 11:33:58

标签: php oop global

我有一个与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一次。

有没有办法做到这一点,还是应该使用全局变量?

4 个答案:

答案 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.