[PHP] Phương thức getInstance() là gì và tại sao dùng getInstance();

Posted by Admin, on 05/05/2011 03:18 PM in PHP - MYSQL with 9,384 views and 0 Comments

getInstance() trong class là một phương thức static. Nó thường dùng để khởi tạo một class mà không cần dùng đến cú pháp new Foo()

Cú pháp thông thường:

  1. $temp =  new Foo();

Sử dụng getInstance();

  1. $temp = Foo::getInstance();

Phương thức getInstance() dùng để làm gì ???

Tình huống: (Singleton pattern)

Giả định mình có một class Registry và mình muốn tạo một đối tượng di nhất cho class này cho ứng dụng của mình. Nghĩa là nếu đối tượng thuộc lớp Registry chưa tồn tại thì mình sẽ tạo một đối tượng mới, ngược lại đã có một đối tượng được tạo rùi thì mình sẽ chỉ cần lấy nó ra mà dùng thôi .

Giải pháp:

Sử dụng phương thức getInstance(), tức là trong class Registry ta tạo một phương thức getInstance().

Khi muốn tạo hay lấy đối tượng (là di nhất) thuộc class này thì chỉ cần sử dụng dòng lệnh Registry::getInstance();

Cụ thể như sau:

  1. class Registry
  2. {
  3.   private static $instance;
  4.   private function __construct(){}
  5.   private function __clone(){}
  6.   public static function getInstance(){
  7.      
  8.   // kiểm tra xem liệu đối tượng đã được tạo chưa (thông qua thuộc tính static $instance đã được set chưa).
  9.        if( !isset( self::$instance ) ){
  10.           // nếu chưa thì tạo mới một đối tượng
  11.          self::$instance = new Registry();
  12.          }
  13.       // Trả về chính đối tượng đã được tạo trước đó
  14.        return self::$instance;
  15.        }
  16. }

Như vậy mổi khi mình muốn sử dụng đối tượng Registry (di nhất) này thì mình sẽ gọi phương thức getInstance()

Registry::getInstance();

Vấn đề quan tâm (nếu có) ở đây là thuộc tính static $instance, phương thức static getInstance() và từ khóa self.

- Thuộc tính static (cũng giống như các ngôn ngữ lập trình khác) là thuộc tính dùng chung (tham chiếu) cho tất cả các instance của class đó.

- Với phương thức static thì ta có thể truy xuất đến phương thức đó mà hok cần thông qua một đối tượng (instance) của class.

Registry::getInstance(); // OK

- Vì $instance là thuộc tính static nên ta sẽ dùng từ khóa self (ko dùng $this) để truy cập đến thuộc tính này ( Vì self sẽ tham chiếu đến class còn $this tham chiếu đến đối tượng hiện tại, cụ thể).

Thêm 1 ví dụ cụ thể nữa:

  1. class ABC{
  2.     static $a = "hhhhhhhh";
  3.     static $_instance;
  4.     static function getInstance(){
  5.         if(self::$_instance !== null){
  6.             return self::$_instance;
  7.         }
  8.         self::$_instance = new ABC();
  9.         return self::$_instance;
  10.     }
  11.     function xxx(){
  12.         echo $this->a . "<br>";
  13.     }
  14. }
  15. $abc = ABC::getInstance();
  16. $abc->a = "123";
  17. $abc->xxx();
  18. $abc2 = ABC::getInstance();
  19. $abc2->xxx();

Output sẽ là:

  1. 123
  2. 123

Chúc thành công !

[PHP] Phương thức getInstance() là gì và tại sao dùng getInstance();[PHP] Phương thức getInstance() là gì và tại sao dùng getInstance();
8109384
Nhận xét
Bạn còn ký tự