2010-09-29 40 views
5

Tôi có một lớp cơ sở dữ liệu, được sử dụng để chọn, cập nhật, xóa MySQL truy vấn.Cách truy cập một đối tượng từ một lớp khác?

Bây giờ, tôi muốn tạo truy vấn MySQL bên trong một lớp khác, nhưng nếu tôi xác định $db = new DB(); trong index.php, tôi không thể sử dụng biến số $db trong một lớp khác. Tôi có phải xác định biến số $db nhiều lần, nếu tôi muốn thực hiện một truy vấn? Hoặc là có một cách để làm cho các $db var với một đối tượng var toàn cầu?

Trả lời

0

Trong index.php tập tin của bạn sử dụng

require_once('path_to_file_with_class.php'); 

Bạn cũng có thể sử dụng include_once, mà sẽ cung cấp cho bạn một cảnh báo thay vì một lỗi nếu file 'path_to_file_with_class.php' là không có sẵn.

-1

Bạn có thể xác định nó như toàn cầu trong file index.php của bạn, và trong constructor lớp cũng đặt $this->db &= $GLOBALS['db'];

5

Bạn có thể muốn một singleton. Điều này cung cấp cho bạn một cách để có được một thể hiện của DB bất cứ nơi nào trong mã. Sau đó, bất cứ nơi nào bạn muốn làm một truy vấn, đầu tiên làm $db = DB::getInstance();.

Phương án thay thế là dependency injection, phiên này chuyển một phiên bản DB cho tất cả các lớp cần có.

+0

Một ví dụ cho mô hình singleton trong php có thể được tìm thấy ở đây: http://www.weberdev.com/get_example-4002.html – Zilverdistel

+0

Để thực hiện một đối tượng có sẵn trên toàn thế giới bạn chỉ cần một phương pháp tĩnh để nhanh chóng nó . Nó không phải là Singleton. Cả hai đều có mùi, do đó Dependency Injection là con đường để đi. – Gordon

0

Xác định nó trên một lớp (riêng biệt PHP tệp). Sau đó, yêu cầu nó cho mỗi tệp PHP var là cần thiết.

0

Đầu tiên hãy tạo lớp cơ sở dữ liệu của bạn là singleton. Và sau đó trong lớp học mới của bạn, bạn có thể làm một cái gì đó như:

class myNewClass{ 
    private $_db; 

    public function __construct(){ 
    $this->_db = DB::getInstance(); 
    } 
} 
0

Sử dụng chức năng ma thuật __autoload().

11

Cách tiếp cận rõ ràng nhất sẽ là aggregate lớp cơ sở dữ liệu khi cần thiết bởi injecting nó. Tất cả các cách tiếp cận khác, như sử dụng từ khóa global hoặc sử dụng phương thức static, đừng nói đến Singleton, giới thiệu sự ghép nối chặt chẽ giữa các lớp của bạn và phạm vi toàn cầu khiến ứng dụng khó kiểm tra và bảo trì hơn. Chỉ cần làm

// index.php 
$db = new DBClass;    // create your DB instance 
$foo = new SomeClassUsingDb($db); // inject to using class 

class SomeClassUsingDb 
{ 
    protected $db; 
    public function __construct($db) 
    { 
     $this->db = $db; 
    } 
} 

Sử dụng Constructor Injection nếu phụ thuộc là cần thiết để tạo ra một nhà nước hợp lệ cho ví dụ. Nếu phụ thuộc là tùy chọn hoặc cần phải hoán đổi cho nhau khi chạy, hãy sử dụng Setter Injection, ví dụ:

class SomeClassUsingDb 
{ 
    protected $db; 
    public function setDb($db) 
    { 
     $this->db = $db; 
    } 
} 
+0

Và làm thế nào chính xác để tôi sử dụng $ db var hơn? $ this-> db-> select(); ? – Mike

+0

@ Giống như vậy, chính xác như thế này. Hoặc thông qua một getter (nếu bạn đã viết một) – Gordon

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