2009-02-13 37 views
8

Tôi hiện đã biến lớp PHP của tôi thiết lập như thế này:Cách tốt nhất để lưu trữ biến lớp trong PHP là gì?

class someThing { 

    private $cat; 
    private $dog; 
    private $mouse; 
    private $hamster; 
    private $zebra; 
    private $lion; 

    //getters, setters and other methods 
} 

Nhưng tôi cũng thấy những người sử dụng một mảng duy nhất để lưu trữ tất cả các biến:

class someThing { 

    private $data = array(); 

    //getters, setters and other methods 
} 

nào làm bạn sử dụng, và tại sao? Những ưu điểm và nhược điểm của mỗi loại là gì?

Trả lời

11

Nói chung, điều đầu tiên là tốt hơn vì những lý do người khác đã nêu ở đây.

Tuy nhiên, nếu bạn cần lưu trữ dữ liệu trên lớp một cách riêng tư, nhưng dấu chân của thành viên dữ liệu không xác định, bạn sẽ thường thấy ví dụ thứ 2 của bạn kết hợp với __get() __set() hooks để ẩn chúng được lưu trữ riêng tư.

class someThing { 

    private $data = array(); 

    public function __get($property) 
    { 
     if (isset($this->data[$property])) 
     { 
      return $this->data[$property]; 
     } 
     return null; 
    } 

    public function __set($property, $value) 
    { 
     $this->data[$property] = $value; 
    } 
} 

Sau đó, các đối tượng của lớp này có thể được sử dụng như một thể hiện của stdClass, chỉ không ai trong số các thành viên bạn thiết lập thực sự nào

$o = new someThing() 
$o->cow = 'moo'; 
$o->dog = 'woof'; 
// etc 

Kỹ thuật này có công dụng của nó, nhưng lưu ý rằng __get() và __set() chậm hơn 10-12 lần so với thiết lập thuộc tính công khai trực tiếp.

6

Nếu bạn đang sử dụng private $data; bạn vừa có một khối dữ liệu không thể xuyên thủng ở đó ... Hãy nói rõ họ sẽ làm cho cuộc sống của bạn dễ dàng hơn nhiều nếu bạn tìm ra cách hoạt động của lớp học.

Một xem xét khác là nếu bạn sử dụng IDE có tính năng tự động hoàn thành - điều đó sẽ không hoạt động với phương pháp thứ 2.

1

Nếu mã lặp lại, mảng và (foreach) vòng gọn gàng mọi thứ. Bạn cần phải quyết định xem khái niệm "động vật" trong mã của bạn có lặp lại hay không, hoặc nếu mã cần đào sâu vào tính độc đáo của mỗi thành viên.

Nếu tôi phải lặp lại nhiều lần, tôi lặp lại.

0

tôi thích phương pháp đầu tiên, đối với một vài lý do:

Trong một IDE tốt, các thuộc tính lớp xuất hiện, ngay cả khi tin/bảo vệ Nó dễ dàng hơn để xem những gì đã được xác định, làm giảm cơ hội bạn lưu trữ cùng một thông tin hai lần. Nếu xe buýt đa ngôn ngữ đánh bạn trên đường về nhà, sẽ dễ dàng hơn rất nhiều cho một nhà phát triển khác đến và đọc mã của bạn. Và mặc dù nó không áp dụng cho var riêng tư, nó làm cho các vars được bảo vệ, trong các lớp mở rộng lớp này, bạn thực sự nên cố gắng tránh phương thức thứ hai cho khả năng đọc thuần túy.

Ngoài ra, như một lưu ý phụ, tôi hầu như luôn chọn bảo vệ riêng tư trừ khi tôi có một lý do rất cụ thể để đặt ở chế độ riêng tư.

Lần duy nhất tôi có thể sử dụng phương pháp thứ hai là nếu tôi đang lưu trữ một bộ sưu tập nhiều loại một thứ.

1
  • Sử dụng phương pháp đầu tiên khi bạn biết mình cần biến đó.
  • Sử dụng phương pháp thứ hai (tập hợp các biến số mảng) khi bạn có nhu cầu biến động.

Bạn có thể kết hợp 2 phương pháp này, vì vậy một số biến được mã hóa cứng vào lớp của bạn, trong khi các biến khác được động. Các biến được mã hóa cứng sẽ có sở thích so với các phương thức ma thuật.

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