質問
私はmemcacheのサーバーと対話するためのクラスを持っています。私は、挿入、削除、およびデータを取得するためのさまざまな機能を持っています。もともと各機能は、しかし、それは、例えば、不必要だった、memcache_connect()
するための呼び出しをした:ます。
mc->insert()
mc->get()
mc->delete()
3つの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;
}
}
まだそれだけのはの1を必要とするとき、2つの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
に一度のコールがあるだろうと呼ばれる回数そして、どんなにます。
これを実行する方法はありますか私はグローバルを使用する必要がありますか?
解決
私は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, ...)
...
他のヒント
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);
など。
私はあなたがここに静的プロパティを探しているのだと思います。
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()
を構築します。 シングルトンのを見てます。
あなたは、依存性注入を使用する必要があります。シングルトンパターンと静的構造、彼らは基本的にグローバルであるため、悪い習慣と考えられている(正当な理由のために - 彼らはいくつかの他のとは対照的に、あなたがインスタンス化どんなクラス使用にあなたをセメント)
。ここでは、簡単なメンテナンスを持たせるために何をすべきかのようなものです。
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.