مشاركة المتغيرات بين الوظائف في PHP دون استخدام Globals

StackOverflow https://stackoverflow.com/questions/550753

  •  23-08-2019
  •  | 
  •  

سؤال

لدي فئة للتفاعل مع خادم 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.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top