Question

J'ai une classe pour interagir avec un serveur memcache. J'ai différentes fonctions pour l'insertion, la suppression et la récupération de données. A l'origine chaque fonction fait appel à memcache_connect(), mais qui était inutile, par exemple:.

mc->insert()  
mc->get()  
mc->delete() 

ferait trois connexions memcache. Je CONTOURNÉS en créant une construction pour la classe:

function __construct() {
    $this->mem = memcache_connect( ... );
}

et puis en utilisant $this->mem chaque fois que la ressource était nécessaire, pour chacune des trois fonctions utilisent la même ressource memcache_connect.

Ceci est bien, si j'appelle la classe à l'intérieur d'autres classes, par exemple:.

class abc
{
    function __construct() {
        $this->mc = new cache_class;
    }
}    
class def
{
    function __construct() {
        $this->mc = new cache_class;
    }
}

alors il continue à faire deux appels memcache_connect, quand il ne a besoin un.

Je peux le faire avec mais je GLOBALS préférerais ne pas les utiliser si je n'ai pas.

Exemple GLOBALS mise en œuvre:

$resource = memcache_connect( ... );

class cache_class
{
    function insert() {
        global $resource;
        memcache_set( $resource , ... );
    }
    function get() {
        global $resource;
        return memcache_get( $resource , ... );
    }

}

Alors, peu importe combien de fois la classe est appelée il n'y aura qu'un seul appel à memcache_connect.

Est-il possible de le faire ou devrais-je utiliser globals?

Était-ce utile?

La solution

Je coderez une autre classe en utilisant un singleton pour obtenir la seule instance de memcache. Comme cela -

class MemCache 
{ 
  private static $instance = false;   
  private function __construct() {}

  public static function getInstance()
  { 
    if(self::$instance === false)
    { 
      self::$instance = memcache_connect(); 
    } 

    return self::$instance; 
  } 
}

et l'utilisation -

$mc = MemCache::getInstance();
memcache_get($mc, ...)
...

Autres conseils

Passez dans l'instance 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);

etc.

Je pense que vous êtes à la recherche de propriétés statiques ici.

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(...);
    }
}

met en œuvre un modèle de base singleton. Au lieu de construire l'appel d'objet mc::getInstance(). Jetez un oeil à singletons .

Vous devez utiliser l'injection de dépendance. Le motif de singleton et les constructions statiques sont considérés comme une mauvaise pratique, car ils sont essentiellement GLOBALS. (Et pour cause - ils vous ciment en utilisant quelque classe instancier par opposition à un autre)

Voici quelque chose comme ce que vous devez faire pour avoir un entretien facile.

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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top