Обмен переменными между функциями в PHP без использования глобальных переменных

У меня есть класс для взаимодействия с сервером 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.