当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在PHP中的函数之间共享变量而不使用全局变量》经验,为你挑选了2个好方法。

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

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



1> Martin Jonáš..:

我会使用单例模式编写另一个类来获取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, ...)
...


@cletus:它使用全局模式,但它没有使用全局范围.程序在一个环境中运行; 在这个组织层面,即使你在类属性中拥有所有真实数据,一切都是全局的.你想避免在全局中使用*变量*,但是外部数据源的接口必须存在于某个地方,并且无论如何你都需要Singleton.

2> Greg..:

传入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);

等等

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有