EN VI

Tìm hiểu Abstract Class và Interface trong lập trình PHP là gì?

Interface và Abstract class là 2 khái niệm cơ bản trong lập trình OOP. Nhưng phân lớn mọi người cảm thấy mơ hồ và lẫn lộn 2 khái niệm này. Vậy chúng là gì, khác nhau như nào? Tại sao dùng cái này Interface mà không phải Abstract và ngược lại?

1. Abstract Class là gì?

    Là lớp trừu tượng đơn giản được xem như một class cha cho tất cả các Class có cùng bản chất. Do đó mỗi lớp dẫn xuất (lớp con) chỉ có thể kế thừa từ một lớp trừu tượng bằng từ khóa extends. Lớp con kế thừa từ lớp trừu tượng có thể override các phương thức trừu tượng trong đó. Lớp trừu tượng có thể khai báo các thuộc tính và các phương thức bình thường và không có thuộc tính trừu tượng (lớp trừu tượng không cho phép khởi tạo tham số, chỉ khai báo mà thôi). Bên cạnh đó nó không cho phép tạo instance, nghĩa là sẽ không thể tạo được các đối tượng thuộc lớp đó. Ví dụ Animal là 1 class trừu tượng thì không thể khai báo : $animal = new Animal. Các phương thức được định nghĩa là abstract trong abstract class thì chỉ khai báo tên hàm và không viết nội dung hàm trong đó. Nội dung sẻ được viết trong class kế thừa khi override lại phương thức đó.

2. Interface là gì?

    Nếu như abstract chỉ sự trừu tượng thì interface thể hiện sự đa hình của lập trình hướng đối tượng trong PHP. Interface không phải là 1 lớp. Nó được mô tả như là 1 bản thiết kế cho các class có chung cách thức hoạt động. Vì không phải là 1 lớp nên không thể định nghĩa các thuộc tính, khởi tạo đối tượng mà chỉ khai báo các phương thức. Các phương thức chỉ khai báo tên hàm và không viết nội dung hàm trong đó. Không có khái niệm phạm vi của phương thức, tất cả đều là public. Lớp con kế thừa từ interface sẻ phải override tất cả các phương thức trong đó. Một lớp có thể kế thừa từ nhiều interface khác nhau bằng từ khóa implements.

3. Khi nào dùng interface và khi nào dùng Abstract Class.

    Nhìn chung abstract class và interface đều được coi như 1 "bản thiết kế" cho các class con kế thừa nó.

    Gọi là "bản thiết kế" vì ví dụ như trong 1 dự án, bạn muốn ép buộc người lập trình phải tuân thủ theo một số các phương thức và các phương thức này đã được định nghĩa sẵn những thứ cơ bản, để giúp cho lập trình viên có thể kế thừa các phương thức này và phát triển lớp con của họ. Thì bạn phải tạo ra các abstract class hoặc interface và liệt kê các phương thức cần thiết trong đó. Do đó abstract class và interface chỉ chứa các khai báo mà không quan tâm bên trong các hàm thực hiện những gì.

    Abstract Class là "bản thiết kế" cho Class: Về bản chất thì abstract class là 1 class nên nó có thể khai báo thêm các thuộc tính và phương thức khác không phải trừu tượng. Nó được xem như "bản thiết kế" cho class vì những class extends lại từ nó ngoài override lại các phương thức trừu tượng của nó thì còn có thể sử dụng các thuộc tính của nó.

    Interface là "bản thiết kế" cho Method: Interface không phải là class nên chỉ dùng để khai báo các phương thức. Nó được xem như "bản thiết kế" cho method vì những class implements lại nó đều phải override lại các phương thức của nó.


=> Abstract thường được sử dụng trong trường hợp các class kế thừa từ nó có cùng bản chất (thuộc 1 nhóm đối tượng). Interface thường được sử dụng trong trường hợp các class kế thừa không có cùng bản chất (nhóm đối tượng) nhưng chúng có thể thực hiện các hành động giống nhau.

4. Phân biệt Abstract Class và Interface trong PHP


Interface
Abstract class
Multiple inheritance
Một class có thể hiện thực nhiều interface.(tạm coi là thừa kế)
Không hỗ trợ đa thừa kế
Default implementation
Không thể định nghĩa code xử lý, chỉ có thể khai báo.
Có thể định nghĩa thân phương thức, property.
Access Modifiers
Mọi phương thức, property đều mặc định là public.
Có thể xác định modifier.
Adding functionality
Mọi phương thức, property của interface cần được hiện thực trong class.
Không cần thiết.
Fields and Constants
Không

Rating: 10 (1 Votes)
Comment

Login


Forgot Your Password?

Create Account


Lost your password? Please enter your email address. You will receive a link to create a new password.

Reset Password

Back to login