2014-04-19 17 views
11

Các ứng dụng PHP của tôi thường sử dụng các lớp để tạo các không gian tên. Các phương thức trong các lớp này được định nghĩa là tĩnh.PHP: Khi nào nên sử dụng Traits và khi nào nên sử dụng các phương thức tĩnh?

Bây giờ PHP đã giới thiệu Đặc điểm, tôi đang cố gắng quấn quanh đầu khi sử dụng chúng. Tôi đã thấy một số ví dụ về việc sử dụng các đặc điểm, nhưng tôi nghĩ điều này có thể dễ dàng được thực hiện thông qua một phương thức lớp tĩnh.

Một ví dụ khá triệt để sử dụng một logger được liệt kê ở đây: Traits in PHP – any real world examples/best practices?

Nhưng tại sao sử dụng một Trait, nếu bạn cũng có thể sử dụng một Logger tĩnh :: log()? Điều duy nhất tôi có thể nghĩ đến ngay bây giờ, là dễ dàng truy cập vào $ này. Một ví dụ khác mà tôi đang đối mặt ngay bây giờ, là một hàm người dùng tồn tại. Trait nó, hoặc phương pháp tĩnh không?

Có ai có thể làm sáng tỏ điều này không?

+1

Cả hai đều khá crap để sử dụng trong một imho codebase. – PeeHaa

+0

@PeeHaa xin hãy giải thích? – Greggg

+0

Cả hai làm cho nó khó khăn để đơn vị kiểm tra mã của bạn, vì khớp nối chặt chẽ. Cũng như duy trì/gỡ lỗi nó bởi vì bằng cách nào đó một số ma thuật "bên ngoài" mảnh mã được "nhập khẩu" vào lớp. – PeeHaa

Trả lời

12

Sau khi đọc các ý kiến ​​về vấn đề, quan điểm của tôi về câu trả lời là thế này:

đặc điểm cho phép mở rộng của một lớp mà không có nó là một phần của hệ thống phân cấp lớp. Không cần một thứ gì đó như class Book extends Loggable, vì Sách không phải là một Loggable, chúng tôi chỉ muốn có chức năng Loggable. Các chức năng trong Loggable có thể được nhồi trong một đặc điểm, do đó có thể sử dụng các phương pháp Loggable trong Sách như thể bạn đang mở rộng từ nó.

Lợi thế của việc sử dụng các đặc điểm ở trên sử dụng các phương pháp tĩnh trong lớp (hoặc các hàm không gian tên) là đặc điểm có quyền truy cập vào phạm vi toàn bộ lớp, cũng là thành viên riêng tư. Nhược điểm của việc sử dụng các chức năng tĩnh thay vì các đặc điểm, là sự kết nối chặt chẽ (phụ thuộc) giữa các lớp, làm tổn thương khả năng sử dụng lại và có thể làm tổn thương thử nghiệm đơn vị (ví dụ khi sử dụng các dịch vụ giả). Phụ thuộc nên được tiêm vào thời gian chạy, mà thực sự làm tăng nỗ lực của instantiating một lớp/phương pháp, nhưng cho phép sự linh hoạt tốt hơn so với các ứng dụng đầy đủ. Đây là một cái nhìn sâu sắc mới cho tôi.

-3

Đặc điểm có thể truy cập các thành viên riêng của đối tượng.

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