Giao diện trong OOP PHP
Như bạn đã biết, lớp trừu tượng đại diện cho một tập hợp các phương thức cho các lớp con của nó. Một phần của các phương thức này có thể được triển khai trong chính lớp đó, và một phần có thể được khai báo là trừu tượng và yêu cầu triển khai trong các lớp con.
Hãy tưởng tượng một tình huống khi lớp trừu tượng của bạn chỉ là một tập hợp các phương thức công khai trừu tượng, mà không thêm các phương thức có sẵn triển khai.
Trên thực tế, lớp cha của bạn mô tả giao diện của các lớp con, tức là tập hợp các phương thức công khai của chúng, bắt buộc phải được triển khai.
Tại sao chúng ta cần điều này: để khi lập trình mắc ít lỗi hơn - bằng cách mô tả tất cả các phương thức cần thiết trong lớp cha, chúng ta có thể chắc chắn rằng tất cả các lớp con thực sự triển khai chúng.
Khi nào điều này sẽ giúp ích: giả sử chúng ta tạo ra lớp cha của mình và một số lớp con từ nó. Nếu sau một thời gian, chẳng hạn, một tháng sau, chúng ta quyết định tạo thêm một lớp con nữa, chắc chắn chúng ta sẽ quên chi tiết mã của mình và hoàn toàn có thể quên viết phần triển khai của một phương thức nào đó trong lớp con mới. Tuy nhiên, chính PHP sẽ không cho phép mất phương thức - và sẽ đơn giản báo lỗi.
Điều tương tự cũng áp dụng cho một lập trình viên khác, làm việc với dự án của bạn. Giả sử mã của lớp cha do bạn viết, và sau đó đồng nghiệp của bạn quyết định tạo thêm một lớp con nữa. Đồng nghiệp của bạn cũng sẽ không thể làm mất một vài phương thức.
Tuy nhiên, có một vấn đề: trên thực tế chúng ta tạo ra lớp cha của mình để viết các phương thức công khai trừu tượng trong đó, nhưng bản thân chúng ta hoặc đồng nghiệp của chúng ta có khả năng vô tình thêm vào lớp này một phương thức không phải công khai hoặc không phải trừu tượng.
Giả sử chúng ta muốn cấm về mặt vật lý việc tạo các phương thức khác trong lớp cha, ngoài các phương thức công khai trừu tượng. Trong PHP, để làm điều này thay vì các lớp trừu tượng có thể sử dụng giao diện.
Giao diện đại diện cho các lớp, trong đó tất cả các phương thức đều là công khai và không có sẵn triển khai. Mã của các phương thức phải được triển khai bởi các lớp con của giao diện.
Giao diện được khai báo giống như các lớp
thông thường, nhưng sử dụng từ khóa interface
thay cho từ class.
Để kế thừa từ giao diện, người ta sử dụng
một thuật ngữ hơi khác: người ta nói rằng
các lớp không kế thừa từ giao diện, mà triển khai
chúng. Tương ứng, thay cho từ extends
nên sử dụng từ khóa
implements.
Không thể tạo đối tượng từ một giao diện. Tất cả các phương thức
của giao diện phải được khai báo là public
và không được có sẵn triển khai. Giao diện
chỉ có thể có các phương thức, không có thuộc tính.
Cũng không thể tạo một giao diện và một lớp với
cùng một tên.