2012-04-20 31 views
7

Sự đóng gói biến, các phương thức Set/Get là các phương pháp hay nhất nhưng tại sao chúng ta lại có cơ hội tuyên bố biến công khai nếu nó không được sử dụng? Nó sẽ tốt hơn nếu các biến luôn được đặt ở chế độ riêng tư theo mặc định mà không có cơ hội làm cho chúng được công khai vì tất cả các hướng dẫn tôi đọc đều nói rằng chúng nên được đóng gói với các phương thức set/get? Có trường hợp sử dụng hợp lệ nào cho các biến công khai ít nhất trong PHP OOP không?Có trường hợp sử dụng hợp lệ nào để sử dụng các biến công khai trong PHP OOP không?

+0

có các trường hợp sử dụng cho các biến được bảo vệ trong các lớp (ví dụ: thừa kế/ghi đè), nhưng tôi không biết bất kỳ trường hợp nào cho các biến công khai.có thể là do khai báo php 4 var $ var trong các lớp được hiểu là công khai trong php 5. – Hajo

+2

Câu trả lời đơn giản: vì có nhiều lý do hoàn toàn hợp lệ khác nhau cho ** not ** (mong muốn) để sử dụng getters và setters, vì vậy bạn chỉ cần truy cập các biến công khai. – CodeCaster

+0

@CodeCaster trong hầu hết các trường hợp của oop động cho thấy thiết kế tồi tôi nghĩ. – Hajo

Trả lời

8

Trên thực tế, đó chỉ là cách vòng khác: Về mặt lý thuyết getters/setters là sai. Các thuộc tính định nghĩa trạng thái của một đối tượng, trong đó các phương thức xác định hành vi. Getters/Setters chỉ chặn truy cập đọc và ghi đối với các thuộc tính, nhưng chúng phá vỡ hoàn toàn nghĩa ngữ nghĩa: Bây giờ đọc trạng thái của một đối tượng là hành vi của đối tượng.

Để đảm tính để trông giống như thuộc tính lại có một RFC trên đường :) https://wiki.php.net/rfc/propertygetsetsyntax

1

Set/Get phương pháp thực hành tốt nhất nhưng tại sao chúng ta có một cơ hội để tuyên bố một công biến nếu nó không có nghĩa là để được sử dụng nào?

Thực tiễn tốt nhất và không được sử dụng không giống nhau. Một ngôn ngữ cần cung cấp các công cụ khác nhau cho các trường hợp sử dụng khác nhau và phải nhất quán.

Đối tượng PHP luôn hỗ trợ thành viên công khai và khi hiển thị khác biệt được giới thiệu, vì lý do tương thích ngược, các thành viên công khai rất hữu ích.

Sẽ tốt hơn nếu biến luôn được đặt ở chế độ riêng tư theo mặc định mà không có cơ hội công khai chúng vì tất cả các hướng dẫn tôi đọc đều phải được đóng gói bằng các phương thức set/get?

Câu hỏi đó không thể được trả lời cụ thể, quá chủ quan và có quá nhiều trường hợp sử dụng khác nhau sẽ dẫn đến một câu trả lời khác.

Có trường hợp sử dụng hợp lệ nào cho các biến công khai ít nhất trong PHP OOP không?

Bắt đầu với tính tương thích ngược. Nếu bạn không thể refactor mã của bạn nhưng sẽ cần phải viết lại nó hoàn toàn tất cả các thời gian, điều này sẽ rất tốn kém.

-1

hãy xem .. đây là lớp API API thực tế từ CakePHP EmailComponent. sử dụng lớp này, bạn chỉ cần "đặt" một số tài sản sau đó chỉ cần send()

$this->Email->to = '[email protected]'; 
$this->Email->from = '[email protected]'; 
$this->Email->title = 'xxx'; 
$this->Email->msg = 'blabla..'; 
$this->Email->send(); 

trên thực tế có rất nhiều tài sản tư nhân và chức năng bên trong lớp này nhưng đó là tư nhân.

Lớp có (một) trách nhiệm làm điều gì đó. Đóng gói chỉ để xuất bản những gì mọi người sử dụng để làm điều đó và giữ kỹ thuật/cơ sở hạ tầng bên trong là riêng.

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