2013-07-04 15 views
6

Tôi có một chút không rõ ràng về việc sử dụng đúng các phương thức tĩnh trong PHP.Sử dụng chính xác các phương thức "getInstance" và tĩnh trong PHP?

Trong kịch bản dưới đây:

<?php 

class Person 
{ 
    public $data; 

    public function __construct($id) 
    { 
     // Fetch record from our data source 
     switch($id){ 
      case 1: 
       $this->data = array('id'=>1, 'name'=>'Mike'); 
       break; 
      case 2: 
       $this->data = array('id'=>2, 'name'=>'Jennifer'); 
       break; 
      default: 
       exit('Record not found!'); 
     } 
    } 

    public function getName() 
    { 
     return $this->data['name']; 
    } 

    public static function getInstance($id) 
    { 
     return new self($id); 
    } 
} 

?> 

tôi sau đó sản lượng tên "Mike" và "Jennifer":

Ví dụ A

<?php 

foreach(array(1,2) as $id) 
    echo Person::getInstance($id)->getName(); 

?> 

Ví dụ B

<?php 

foreach(array(1,2) as $id){ 
    $person = new Person($id); 
    echo $person->getName(); 
} 

?> 

Hoặc sẽ in "MikeJennifer", nhưng tôi đã được thông báo Ví dụ A sai, "vì Người không phải là một lớp tĩnh".

Một lớp không thể được khai báo "tĩnh" trong PHP, vậy tại sao nó lại quan trọng?

+1

"nhưng tôi đã được thông báo Ví dụ A sai" --- không phải. Người nói với bạn là sai. – zerkms

+2

Tại sao người đó lại sai? Đoạn đầu tiên trông giống như một mẫu đơn. Nó không có vẻ là cần thiết trong trường hợp này ... –

+0

Lớp này sẽ vẫn cho phép nhiều phiên bản. Vì vậy, nó trông giống như một thực hiện xấu của một Singleton. Một số loại lai lớp – tlenss

Trả lời

3

Trong "Thiết kế nổi bật", Scott L Bain mô tả đây là mẫu bước đầu tiên trong việc trừu tượng hóa việc tạo đối tượng.

Ngày 1: Không trừu tượng ...

$person = new Person($id); 

Ngày 2: một phương pháp tĩnh để xây dựng các đối tượng cho bạn ...

$person = Person::getPerson($id); 

Tại sao? Bởi vì bây giờ bạn chỉ có một đoạn mã trong toàn bộ ứng dụng của bạn mà biết cách "làm mới" một người, thay vì có nhiều dòng mã được phân phối trong toàn bộ ứng dụng của bạn có kiến ​​thức đó. Nếu bạn thay đổi cách xây dựng một đối tượng người trong tương lai, bạn sẽ có thể thay đổi phương thức tĩnh getPerson.

Ngày 3+: bạn có thể quyết định dựa vào trình tạo đối tượng hoặc kho lưu trữ để tạo đối tượng. Khi bạn chọn thực hiện việc này, bạn có thể cập nhật phương thức tĩnh getPerson để sử dụng trình tạo/kho lưu trữ và một lần nữa thay đổi xảy ra chỉ ở một nơi.

Điều này được gọi là "sự gắn kết". Có mã nơi bạn có thể thực hiện thay đổi mà không phải mở nhiều tệp.

+0

Không phải là không đồng ý, điều này có vẻ thú vị, nhưng sự khác biệt giữa việc thay đổi phương thức 'getPerson' và chỉ thay đổi hàm tạo' Person' là gì? –

+0

@Wesley Murch: điều này có thể làm sáng tỏ: http://en.wikipedia.org/wiki/Builder_pattern – zerkms

+1

Nếu bạn sử dụng 'new Person ($ id)' trong suốt mã của bạn (nói, 20 lần) bạn cần phải thay đổi constructor 20 lần. Sử dụng 'Person :: getPerson ($ id)' bạn không phải thay đổi mã đó. Ví dụ, nếu tôi cần chuyển một phụ thuộc vào 'người mới', tôi sẽ không phải tạo và vượt qua sự phụ thuộc ở 20 nơi, chỉ một. – Fenton

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