У меня есть класс для взаимодействия с сервером memcache. У меня есть разные функции для вставки, удаления и извлечения данных. Первоначально каждая функция memcache_connect()
вызов 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
.
Есть ли способ сделать это или я должен просто использовать глобальные переменные?
Я бы закодировал другой класс, используя singleton pattern для получения единственного экземпляра 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.