2009-02-15 28 views
5

Tôi có một lớp để tương tác với một máy chủ memcache. Tôi có các chức năng khác nhau để chèn, xóa và truy xuất dữ liệu. Nguyên mỗi chức năng thực hiện một cuộc gọi đến memcache_connect(), tuy nhiên đó là không cần thiết, ví dụ .:Chia sẻ các biến giữa các hàm trong PHP mà không sử dụng các globals

mc->insert() 
mc->get() 
mc->delete() 

sẽ làm cho ba kết nối memcache. Tôi làm việc này bằng cách tạo ra một cấu trúc cho lớp:

function __construct() { 
    $this->mem = memcache_connect(...); 
} 

và sau đó sử dụng bất cứ nơi nào $this->mem tài nguyên là cần thiết, vì vậy mỗi trong ba chức năng sử dụng cùng một tài nguyên memcache_connect.

Đây là alright, tuy nhiên nếu tôi gọi là lớp bên trong các lớp khác, ví dụ .:

class abc 
{ 
    function __construct() { 
     $this->mc = new cache_class; 
    } 
}  
class def 
{ 
    function __construct() { 
     $this->mc = new cache_class; 
    } 
} 

sau đó nó vẫn đang thực hiện hai memcache_connect cuộc gọi, khi nó chỉ nhu cầu một.

Tôi có thể làm điều này với hình cầu nhưng tôi không muốn sử dụng chúng nếu tôi không phải.

Ví dụ globals thực hiện:

$resource = memcache_connect(...); 

class cache_class 
{ 
    function insert() { 
     global $resource; 
     memcache_set($resource , ...); 
    } 
    function get() { 
     global $resource; 
     return memcache_get($resource , ...); 
    } 

} 

Sau đó, dù có bao nhiêu lần so với lớp được gọi là chỉ có sẽ là một cuộc gọi đến memcache_connect.

Có cách nào để làm điều này hay tôi chỉ nên sử dụng hình cầu?

Trả lời

9

tôi sẽ mã lớp khác sử dụng Singleton pattern để nhận được trường hợp duy nhất của memcache. Như thế này -

class MemCache 
{ 
    private static $instance = false; 
    private function __construct() {} 

    public static function getInstance() 
    { 
    if(self::$instance === false) 
    { 
     self::$instance = memcache_connect(); 
    } 

    return self::$instance; 
    } 
} 

và sử dụng -

$mc = MemCache::getInstance(); 
memcache_get($mc, ...) 
... 
+0

Đó là giải pháp hợp lý nhưng hãy đối mặt với nó, đó là toàn cầu. :) – cletus

+0

Đây là những gì tôi muốn làm. Bạn không thể kiểm tra nó, nhưng chúng ta hãy trung thực, những người kiểm tra loại điều này anyway? –

+0

Câu hỏi đặt ra là làm thế nào có thể kiểm tra ở lại phần còn lại của toàn bộ mã nếu một phần nhỏ không thể kiểm tra được. Hoặc làm thế nào bạn sẽ thực hiện một đối tượng MemCache mô phỏng cho các thử nghiệm khác? – okoman

5

đèo trong trường hợp 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); 

, vv

2

Tôi nghĩ rằng bạn đang tìm kiếm các thuộc tính tĩnh ở đây.

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(...); 
    } 
} 

Công cụ này thực hiện mẫu đơn cơ bản. Thay vì xây dựng đối tượng, hãy gọi mc::getInstance(). Hãy xem singletons.

+0

Hài hước cách mọi người bỏ phiếu sau khi đọc không quá câu đầu tiên của câu trả lời. +1 một lần nữa. – Tomalak

1

Bạn nên sử dụng tính năng tiêm phụ thuộc. Mẫu đơn và cấu trúc tĩnh được coi là thực hành không tốt bởi vì về cơ bản chúng là các hình cầu (và vì lý do chính đáng - chúng giúp bạn sử dụng bất kỳ lớp nào bạn khởi tạo như trái ngược với một số khác).

Dưới đây là một số việc bạn nên làm để bảo trì dễ dàng.

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. 
Các vấn đề liên quan