2010-07-04 51 views
7

Tôi đã là một lập trình viên thủ tục trong hơn 4 năm và đã đến lúc bắt đầu tìm kiếm OOP. Với điều đó nói rằng, chúng ta hãy nói rằng tôi cần phải gọi hai phương pháp trong lớp học của tôi. Mỗi phương thức đều yêu cầu kết nối với DB vì vậy đó là hai chuyến đi tới DB, cũng mở ra nhiều kết nối. Điều này có thể tránh được bằng cách có một số loại mã trong lớp ứng dụng (constructor?) Hoặc không có một hồ bơi kết nối phải được thiết lập ở phía DB? Và chỉ để đá, tôi không sử dụng mysql; Tôi đang sử dụng mongodb với codeigniter.Cách tránh mở nhiều kết nối tới DB bằng OOP PHP

Đây là những gì tôi có cho đến nay, không chắc liệu nó có lý tưởng để sử dụng không?

Đây là nơi tôi thiết lập thông tin DB của tôi:

database_conn.php

class Database_Conn extends Model { 

    function _connect() { 
     $m = new Mongo("localhost:27017", array("persist"=>"x")); 
     $db = $m->selectDB("foo"); 
     return $db; 
    }  
}  

mẫu mô hình tập tin

class Home_model extends Model { 

    public function __construct() { 
     // Establish connection to "profiles" table 
     $this->db_conn = Database_Conn::_connect()->selectCollection("profiles"); 
    } 

    function getMyProfile($username) { 
     $data = $this->db_conn->findOne(array("username" => $username)); 
     return $data; 
    } 

    function getAll() { 
     $data = $this->db_conn->find(); 
     return $data; 
    } 
} 

Trả lời

6

bạn nên sử dụng singleton pattern

EDIT: cách bạn đã làm, có thể gọi _connect nhiều lần, có nghĩa là kết nối lại.

thực hiện singleton thường có nghĩa là bạn phải đặt hàm tạo riêng/được bảo vệ và xác định phương thức getInstance tạo kết nối trên cuộc gọi đầu tiên và trả về kết nối đã tạo trên các cuộc gọi sau.

đây là những gì tôi sẽ làm gì:

class Database_Conn extends Model { 

    static protected $_instance; 

    protected $db = null; 

    final protected function __construct() { 
     $m = new Mongo("localhost:27017", array("persist"=>"x")); 
     $this->db = $m->selectDB("foo"); 
    } 

    static public function getInstance() { 
     if (!(self::$_instance instanceof self)) { 
      self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    public function getConnection() { 
     return $this->db; 
    } 

    final protected function __clone() { } 
} 

và sau đó sử dụng Database_Conn::getInstance()->getConnection() để có được những đối tượng kết nối.

+0

tôi nghĩ điều này là xấu đối với các ứng dụng cuối cùng cần phải mở rộng? – luckytaxi

+0

singleton là một cách để tạo một đối tượng được khởi tạo chính xác một lần. làm thế nào nó có thể làm giảm khả năng mở rộng? xin vui lòng cho tôi biết) –

+0

Xin lỗi, tôi đã nghĩ đến điều gì khác (không hỏi). Tôi hiểu những gì bạn đang nói, tôi thikn tôi đang làm điều đó ngay bây giờ. Hãy xem mã của tôi ở trên. Cảm ơn. – luckytaxi

6

Bạn nên xem xét một lớp người quản lý cho các kết nối db của mình. Sau đó, bạn có thể có một vị trí trung tâm nơi bạn yêu cầu kết nối. Nếu đã có kết nối mở, người quản lý có thể trả lại thay vì trả lại kết nối mới.

Đây sẽ là một cách tiếp cận. Có rất nhiều ví dụ trên mạng về cách thực hiện một cái gì đó như thế này. Đã có một số cho mysql và mssql. Nhưng bạn chắc chắn có thể mở rộng cho db của bạn.

+0

điều này nghe có vẻ quen thuộc với những gì kgb đã thể hiện, phải không? – luckytaxi

+0

. Nhưng nếu bạn nhìn vào thời điểm chúng tôi đăng tải chúng đúng vào cùng một lúc. Mặc dù anh ấy cũng thực hiện một chỉnh sửa sau khi bao gồm nhiều hơn nữa. – spinon

+0

không có vấn đề gì, tôi đã nhận ra điều đó nhưng muốn đảm bảo rằng tôi hiểu khái niệm chính xác. Cảm ơn một lần nữa! – luckytaxi

1

Sử dụng lớp cơ sở dữ liệu. Dibi là một thư viện tuyệt vời trong trường hợp này. http://dibiphp.com

Các vấn đề liên quan