2016-09-13 17 views
12

Gần đây tôi đã xem qua số Traits bằng PHP và cố gắng hiểu chúng. Trong nghiên cứu của tôi, tôi tình cờ gặp câu hỏi SO này: Traits vs. Interfaces. Câu trả lời được chấp nhận đề cập đến những điều sau:Sự khác biệt giữa Trait và Lớp Tóm tắt trong PHP

Giao diện xác định tập hợp các phương thức mà lớp triển khai phải thực hiện .

Khi một đặc điểm được sử dụng, việc triển khai các phương pháp cũng đi kèm theo số - điều này không xảy ra trong Giao diện.

Cho đến nay rất tốt nhưng điều này nghe có vẻ giống như sự khác biệt giữa giao diện và lớp trừu tượng với tôi. Vì vậy, điều này đặt ra một câu hỏi tiếp theo cho tôi:

  • Sự khác biệt giữa một Trait và một lớp trừu tượng trong PHP là gì?

Tôi biết rằng tôi chỉ có thể mở rộng từ một lớp trừu tượng và mặt khác sử dụng bất kỳ số lượng đặc điểm nào. Nhưng đây thực sự là sự khác biệt duy nhất? Tôi vẫn chưa hoàn toàn hiểu được những đặc điểm và cách sử dụng của nó vì vậy tôi hy vọng đây không phải là một câu hỏi ngớ ngẩn.

+1

có thể hữu ích: http://stackoverflow.com/a/20866390/3840840 –

Trả lời

18

Đặc điểm cho phép bạn chia sẻ mã giữa các lớp học của bạn mà không buộc bạn vào một hệ thống phân cấp lớp cụ thể. Giả sử bạn muốn tất cả các lớp của bạn có phương thức tiện ích thuận tiện foo($bar); mà không cần những đặc điểm bạn có hai lựa chọn:

  • thực hiện nó riêng với mã dư thừa trong mỗi lớp
  • kế thừa từ một lớp chung (trừu tượng) tổ tiên

Cả hai giải pháp không phải là lý tưởng, mỗi với họ sự cân bằng khác nhau. Mã dự phòng rõ ràng là không mong muốn, và kế thừa từ một tổ tiên chung làm cho thiết kế phân cấp lớp của bạn không linh hoạt.

Đặc điểm giải quyết vấn đề này bằng cách cho phép bạn triển khai foo($bar) trong một đặc điểm mà mỗi lớp có thể "nhập" riêng lẻ, trong khi vẫn cho phép bạn thiết kế phân cấp lớp theo yêu cầu logic nghiệp vụ.

+0

Vì vậy, nếu tôi nhận được quyền này, các đặc điểm cơ bản được cho là sử dụng cùng một mã trong một số lớp không liên quan theo bất kỳ cách nào? – simon

+5

Vâng, chính xác. Hãy suy nghĩ về nó như là các bit nhỏ và miếng mà bạn có thể sử dụng để đặt một lớp với nhau từ (thành phần). Tùy thuộc vào khả năng tái sử dụng mã trong ứng dụng của bạn, bạn có thể thực hiện mọi thứ như một đặc điểm và sau đó chỉ kết hợp một số đặc điểm với nhau thành các lớp thực tế trong các cấu hình khác nhau. – deceze

+0

Cảm ơn bạn, điều này thực sự giúp tôi hiểu các đặc điểm – simon

5

Không chính xác ... Hãy trích dẫn tài liệu chính thức cho mục đích này:

Một Trait cũng tương tự như một lớp, nhưng chỉ nhằm mục đích nhóm chức năng một cách hạt mịn và nhất quán. Không thể tự khởi tạo một Trait. Nó là một bổ sung cho truyền thống thừa kế và cho phép thành phần ngang của hành vi; nghĩa là, việc áp dụng các thành viên của lớp mà không yêu cầu thừa kế.

Vì vậy, Đặc điểm được sử dụng cho mục đích sáng tác để cho phép lớp thực hiện một số logic/hành vi. Nếu bạn đang kế thừa từ một lớp trừu tượng khác, nó thường cho các mục đích đa hình và bạn có được một hệ thống phân cấp thừa kế/lớp riêng biệt, có thể hoặc không mong muốn.

Tôi nghĩ tất cả phụ thuộc vào ngữ cảnh, về kiến ​​trúc và chính xác bạn đang cố gắng làm gì.

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