So sánh abstract và interface trong php

Dùng Interface như một “bản thiết kế” của class? Đây là một điều thường được dùng để trả lời cho hai câu hỏi:

  • Interface được dùng để làm gì?
  • Tại sao không thể định nghĩa phần thân cho các phương thức của interface.

Xét ở một mức độ nào đó điều này là hợp lý, nhưng như đã nói ở phần trên, nó chỉ được dùng để mô tả một Abstract`9 cho một `chức năng của class. Nếu muốn tạo một bản thiết kế tổng thể, hãy sử dụng abstract class. Một bản thiết kế tổng thể tất nhiên sẽ có những thứ đã được dựng sẵn và có những thứ là `Interface`2.

Một câu trả lời có thể lý giải phần nào câu hỏi thứ hai là việc cho phép định nghĩa thân phương thức trong các interface có thể khiến cho hiệu suất bị giảm sút. Nguyên nhân là việc tìm kiếm các phương thức sẽ diễn ra lâu hơn vì phải duyệt qua các interface, thay vì chỉ cần phải tìm trong class cha của nó.

Về công dụng của interface, xét ở mức ứng dụng, các interface có thể được hiểu như các plugin hoặc thư viện/phần mềm Interface`4. Việc hiện thực một `interface cho class cũng giống như cài thêm plugin cho một phần mềm vậy.

Bảng so sánh

Cuối cùng, cũng nên liệt kê các điểm khác biệt giữa hai khái niệm này để bạn có thể sử dụng được khi cần thiết. Các điểm khác biệt này có thể khác nhau tùy vào ngôn ngữ mà bạn sử dụng. Vì vậy bạn chỉ cần nhớ các điểm căn bản sau:

Lớp (Class) trong lập trình hướng đối tượng là một khuôn mẫu hoặc một bản thiết kế, mô hình mô phỏng các đối tượng.

Đối tượng là các thể hiện của lớp, một đối tượng là một sự tượng trưng cho một thực thể, hoặc là thực thể tồn tại trong thế giới đời thực hoặc thực thể mang tính khái niệm. Một đối tượng có thể tượng trưng cho cái gì đó cụ thể.

Ví dụ: một chiếc Mercedes Benz là một đối tượng thuộc lớp Car, một chiếc IphoneX là đối tượng thuộc lớp Mobile,…

Các ngôn ngữ hướng đối tượng như Java, C#,… hỗ trợ khái niệm kế thừa. Kế thừa có nghĩa là một đối tượng có thể được thừa kế các hành vi và phương thức của lớp. Bất cứ khi nào bạn tạo đối tượng mới của một lớp, bạn nói rằng bạn đang khởi tạo nó.

Lớp trừu tượng (Abstract Class)

Là một lớp nhưng không thể tạo ra thực thể. Abstract class có thể chứa hoặc không chứa phương thức abstract – một phương thức chỉ có khai báo mà không chứa cài đặt.

abstract class Cars { int gas; int getGas() {

  return this.gas;
} abstract void run(); } class Merc extends Cars { void run() {
    print("Fast");
} }

Giải thích: Trong phần đầu tiên của mã, khai báo một lớp trừu tượng Cars. Các phương thức của lớp trừu tượng Cars sẽ được kế thừa bởi các lớp con.

Interface

Một interface không phải là một lớp (class), giống như lớp trừu tượng. Nó chứa các phương thức mà không phần thân. Một interface không thể tự làm bất cứ điều gì. Interface như một khuôn mẫu. Với ngôn ngữ Java không hỗ trợ đa kế thừa nhưng có thể triển khai nhiều interface.

interface Cars {

 void run();
 int getGas();
} class Merc implements Cars {
int gas;
void run()
{
print("Faster");
}
int getGas()
{
return this.gas;
}
}

Giải thích: Chúng ta có thể thấy, các phương thức của interface không có phần thân, chỉ xác định kiểu dữ liệu trả về và tên phương thức, không giống như lớp trừu tượng mà chúng ta đã khai báo trước đó.

Sự khác biệt giữa Abtract class và Interface

Một interface chứa một tập hợp các phương thức. Một lớp implements interface phải triển khai các phương thức này.

Một lớp trừu tượng, giống như một interface, sẽ chứa các phương thức. Tuy nhiên, sẽ có ít nhất một phương thức đã hoàn thành tức là phương thức có phần thân. Đây là một sự khác biệt chính giữa abstract class và interface.

Trong bài này, chúng ta sẽ tìm hiểu về lớp trừu tượng (abstract class) và interface trong PHP. Để học tốt bài này, các bạn cần đọc lại bài để biết cách chạy ứng dụng web PHP với XAMPP.

Một lớp trừu tượng (abstract class) là một lớp chứa ít nhất một phương thức abstract (abstract method). Một phương thức abstract là một phương thức chỉ được khai báo mà không có bất cứ dòng code nào trong thân phương thức. Access modifier của abstract method phải là public hoặc protected.

Lưu ý: Abstract class có thể có những thuộc tính và phương thức bình thường khác.

Khi một lớp con kế thừa một lớp trừu tượng, lớp con đó phải định nghĩa lại các phương thức trừu tượng của lớp cha mà nó kế thừa được.

Trong PHP, một abstract class hoặc abstract method được định nghĩa với từ khóa abstract. Ví dụ:

  

Lưu ý: Nếu lớp con không định nghĩa lại phương thức abstract kế thừa được từ lớp cha thì chương trình sẽ báo lỗi.

2. Interface trong PHP

Trong PHP, interface chỉ chứa khai báo của những phương thức không có bất cứ dòng code nào trong thân phương thức. Những lớp con thực thi (implement) một interface phải định nghĩa lại tất cả phương thức của interface mà nó kế thừa được.

Khi nhiều lớp thực thi cùng một interface thì các lớp sẽ có những hàm cùng tên với nhau nhưng được thực thi khác nhau. Đó là một biểu hiện của tính đa hình (polymorphism) trong lập trình hướng đối tượng (Object-Oriented Programming).

Trong PHP, một interface được khai báo với từ khóa interface.

  

Các lớp thực thi một interface bằng cách sử dụng từ khóa implements.

makeSound();
}
?>  

Trong ví dụ trên, các lớp Cat, Dog, Mouse thực thi interface Animal và định nghĩa lại hàm makeSound(). Mỗi lớp Cat, Dog, Mouse lại định nghĩa hàm makeSound() theo cách riêng. Cùng là Animal nhưng có các loài khác nhau như Cat, Dog, Mouse. Mỗi loài này lại có tiếng kêu – makeSound() khác nhau. Việc này thể hiện tính đa hình (polymorphism) của đối tượng.

3. So sánh giữa abstract class và interface trong PHP

Interface và abstract class khá giống nhau nhưng chúng cũng có những điểm khác nhau. Các điểm khác nhau giữa interface và abstract class là:

  • * Interface không thể có thuộc tính (properties), abstract classes có thể có thuộc tính.
    • Tất cả phương thức của interface phải là public, các phương thức của abstract class là public hoặc protected.
    • Tất cả phương thức trong interface là abstract. Vì thế, chúng ta có thể không cần sử dụng từ khóa abstract trước các method trong interface.
    • Các lớp có thể thực thi một interface đồng thời kế thừa từ một lớp khác.

Trong bài này, chúng ta đã tìm hiểu về interface và abstract class. Chúng có những điểm khác nhau nhất định. Các bạn cần lưu ý những điểm khác nhau này để lựa chọn sử dụng interface hoặc abstract class cho phù hợp.