Frage

Ich habe eine Klasse für mit einem memcache Server interagieren. Ich habe verschiedene Funktionen zum Einfügen, Löschen und Abrufen von Daten. Ursprünglich jede Funktion Anruf für memcache_connect(), aber das war nicht nötig, z.

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

würden drei memcache Verbindungen herzustellen. Ich arbeitete, um diesen durch ein Konstrukt für die Klasse zu erstellen:

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

und dann mit $this->mem wo die Ressource benötigt wurde, so dass jede der drei Funktionen verwendet die gleiche memcache_connect Ressource.

Das ist in Ordnung, aber wenn ich die Klasse in anderen Klassen nennen, z.

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

dann ist es immer noch machen zwei memcache_connect Anrufe, wenn es nur muss ein.

Das kann ich mit Globals tun, aber ich würde es vorziehen, sie nicht zu verwenden, wenn ich nicht haben.

Beispiel Globals Umsetzung:

$resource = memcache_connect( ... );

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

}

Dann, egal wie oft die Klasse nur genannt wird, wird ein Anruf memcache_connect.

Gibt es eine Möglichkeit, dies zu tun, oder soll ich nur Globals verwenden?

War es hilfreich?

Lösung

würde ich eine andere Klasse mit Singletonmuster codiert die einzige Instanz von memcache für immer. Wie dies -

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

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

    return self::$instance; 
  } 
}

und Nutzung -

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

Andere Tipps

Der Pass in dem MC Beispiel:

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.

Ich glaube, Sie suchen statische Eigenschaften hier.

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

Dies implementiert eine grundlegende Singletonmuster. Anstatt den Objektaufruf mc::getInstance() zu konstruieren. Hier finden Sie aktuelle Singletons .

Sie sollten Dependency Injection verwenden. Die Singletonmuster und statische Konstrukte sind schlechte Praxis betrachtet, weil sie im Wesentlichen Globals sind. (Und das aus gutem Grund - sie Sie zementieren zu verwenden, was auch immer Klasse, die Sie zu einem anderen im Gegensatz instanziiert)

Hier ist etwas wie das, was man tun soll, um eine einfache Wartung zu haben.

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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top