مشاركة المتغيرات بين الوظائف في PHP دون استخدام Globals
سؤال
لدي فئة للتفاعل مع خادم memcache. لدي وظائف مختلفة لإدراج وحذف واسترجئة البيانات. في الأصل أصبحت كل وظيفة مكالمة 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
المكالمات، عندما يكون فقط الاحتياجات واحد.
يمكنني القيام بذلك مع Globals ولكنني أفضل عدم استخدامها إذا لم يكن لدي ذلك.
تطبيق Globals:
$resource = memcache_connect( ... );
class cache_class
{
function insert() {
global $resource;
memcache_set( $resource , ... );
}
function get() {
global $resource;
return memcache_get( $resource , ... );
}
}
ثم بغض النظر عن عدد المرات التي يطلق عليها الطبقة ستكون هناك مكالمة واحدة فقط memcache_connect
.
هل هناك طريقة للقيام بذلك أو يجب علي استخدام Globals؟
المحلول
أود رمز فئة أخرى باستخدام نمط Singleton للحصول على مثيل MECCACHE الوحيد. مثله -
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(...);
}
}
هذا ينفذ نمط singleton الأساسي. بدلا من بناء مكالمة الكائن mc::getInstance()
. وبعد القي نظرة على المفردون.
يجب عليك استخدام حقن التبعية. تعتبر النمط المفروم والبناء الثابت ممارسة سيئة لأنها في الأساس هي Globals (ولسبب وجيه - إنهم يعززونك استخدام أي فئة تقوم بإنشاء مثيل لها بدلا من البعض الآخر).
هنا شيء مثل ما يجب عليك فعله من أجل صيانة سهلة.
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.