2010-04-22 28 views
6

Nếu tôi có một lớp "người" với một tên thuộc tính $ và getter của nó (get_name()) và setter (set_name()) phương pháp, sau đó sau khi instantiating các đối tượng và thiết lập tài sản tức làTại sao tài sản Accesing trực tiếp không được khuyến nghị trong OOPs PHP?

$paddy = new person(); 

$paddy->set_name("Padyster Dave"); 

echo "Paddy's full name: ".$paddy->name; //WHY THIS IS NOT RECOMMENDED... 

Trong các mã trên $paddy->name; TẠI SAO NÀY kHÔNG đƯỢC KHUYẾN

EDIT

trên mã là một mẫu mã mà không gán bất kỳ accessifi ers .. Chỉ cần hiểu khái niệm $ paddy-> name

+0

Một từ buzz trong ngữ cảnh này: Ẩn thông tin http://en.wikipedia.org/wiki/Information_hiding Và những gì bạn yêu cầu áp dụng cho OOP nói chung không chỉ PHP. –

+0

Tôi đã sử dụng cú pháp của php và gắn thẻ câu hỏi cho phần PHP đó là lý do tại sao thêm từ khóa PHP, tôi nhận thức được thực tế này là tổng quát của nó cho nhiều ..Cảm ơn –

Trả lời

6

Vì bạn có thể một ngày nào đó thoát khỏi $name thành viên, thay thế nó bằng (ví dụ) $first_name, $last_name và một phương pháp fullname() (không rằng đó là một good idea). Tất nhiên, với __get and __set, nó không quan trọng lắm.

Thông thường, việc đặt thuộc tính có thể không đơn giản như lưu trữ giá trị. Việc cấp quyền truy cập trực tiếp vào các trường thành viên có thể dẫn đến các chức năng khác khiến một đối tượng ở trạng thái không nhất quán. Hãy tưởng tượng bạn lưu trữ một mảng cần phải được sắp xếp; nếu mảng được công khai, một cái gì đó khác có thể gán một mảng chưa được phân loại cho trường.

8

Điều lạ lùng là bạn có người đặt cược nhưng đang rời khỏi thuộc tính public. (Giả sử không có __get ma thuật đang diễn ra.)

Bạn thường muốn sử dụng getters/setters để kiểm soát nhiều hơn những gì có thể được gán cho thuộc tính và những gì không thể. Hoặc, bạn có thể muốn thực thi mã khi thuộc tính được truy cập hoặc thay đổi. Trong cả hai trường hợp, bạn nên ép buộc sử dụng getters/setters bằng cách tạo thuộc tính private hoặc protected, nếu không nó sẽ là vô nghĩa. Đó là về việc ngăn cản bản thân hoặc những người khác sẽ sử dụng lớp học để tự chụp chân mình.

Nếu setter trong ví dụ của bạn chỉ thiết lập giá trị mà không làm bất cứ điều gì khác, nó không cần thiết. Nếu nó làm một cái gì đó khác là cần thiết bất cứ khi nào giá trị được thiết lập, bạn có một lỗ hổng trong thiết kế lớp học của bạn vì nó có thể thay đổi giá trị mà không sử dụng setter.


class Foo { 
    public $bar = 0; // is only allowed to contain numeric values 
    public function setBar($val) { 
     if (is_numeric($val)) { 
      $this->bar = $val; 
     } 
    } 
} 

$obj = new Foo(); 
$obj->bar = 'some value'; // set a string, which is not allowed 

Nếu bạn muốn làm cho $barprotected, điều đó sẽ không thể thực hiện.

+0

"Nếu nó làm điều gì đó cần thiết bất cứ khi nào giá trị là thiết lập, bạn có một lỗ hổng trong thiết kế lớp học của bạn vì nó có thể thay đổi giá trị mà không sử dụng setter. " U có thể xây dựng điều này không? plss –

+0

@Parth Xem câu trả lời cập nhật. – deceze

+0

@Parth Nếu bạn thực hiện 'protected $ bar = 0;', '$ obj-> bar' không được phép và sẽ ném cảnh báo. Đọc bài này: http://php.net/manual/en/language.oop5.visibility.php – deceze

3

Phơi bày các lĩnh vực công cộng sẽ là một habit.From xấu một good artical về nguyên tắc OO trong PHP

Nếu bất cứ điều gì thay đổi với các đối tượng, bất kỳ mã có sử dụng nó cần phải thay đổi là tốt. Ví dụ: nếu tên, gia đình và các tên khác của người đó được đóng gói trong đối tượng PersonName, bạn sẽ cần phải sửa đổi tất cả mã của mình để phù hợp với thay đổi.

0

Rõ ràng là tôi cũng đang làm những điều 'xấu' khi tôi sử dụng loại mã này mọi lúc.

Nhưng nếu $ this-> Tên (hoặc là tôi sẽ làm $ this-> nameFormatted) được xây dựng như:

protected var $name; 
$this->name = $this->getSalutation() . ' ' . $this->nameFirst . ' ' . $this->nameLast; 

hoặc một cái gì đó dọc theo những đường.

Bạn đang sử dụng $ this-> đặt tên trong ngữ cảnh công khai nhưng vẫn được tạo trong lớp và nếu được bảo vệ, nó sẽ không bị ghi đè.

Hoặc tôi có thiếu điểm và điều 'xấu' thực sự được đặt tên trong phạm vi công khai không?

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