× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Interface và Abstract trong PHP - So sánh khái niệm Interface và Abstract

12/06/2021 01:46

Interface và Abstract class là hai khái niệm cơ bản thường gặp trong lập trình hướng đối tượng (OOP). Trong PHP đây cũng là hai cụm từ được nhắc tới thường xuyên khi làm việc với ngôn ngữ lập trình PHP. Trong bài viết trước, chúng ta đã tìm hiểu về Interface trong PHP. Trong bài viết này, cùng tìm hiểu sự khác biệt giữa hai  khái niệm và so sánh sự khác biệt giữa Interface và Abstract trong PHP bạn nhé!

Khái niệm về Interface và Abstract trong PHP

Lớp Abstract (lớp trừu tượng) là gì?

Khái niệm về Interface và Abstract trong PHP

Khái niệm về Interface và Abstract trong PHP

Lớp abstract là một lớp có ít nhất một phương thức abstract. Các lớp khác khi kế thừa lớp trừu tượng này sẽ phải định nghĩa lớp trừu tượng ấy. Một class chỉ có thể kế thừa một lớp trừu tượng. 

Cú pháp khai báo lớp Abstract như sau:

abstract class Database

{

     abstract protected function checkExistUser();

     abstract protected function updateUser();

}

>>> Tham khảo: Khóa học lập trình PHP

Interface (giao diện) trong PHP

Bạn có thể coi Interface như một loại mẫu hoặc hợp đồng cho các lớp cụ thể của bạn. Lớp hoàn toàn trừu tượng được gọi là giao diện. Bất kỳ lớp nào triển khai giao diện đều phải sử dụng từ khóa triển khai - implements và tất cả các phương thức được khai báo trong lớp phải được định nghĩa ở đây. Mặt khác, lớp này cũng cần được định  nghĩa như abstract. Khi 1 hoặc nhiều lớp sử dụng cùng một interface , nó sẽ được gọi là đa hình - polymorphism.

// interface

interface class DataInterface {

 public function insertData($varDataRecord);

 public function deleteData($varRecordId);

}

interface class DataFilterInterface {

 public function getList($varFilter);

}

>>> Đọc thêm: Filter trong PHP - Giải mã thông tin về Filter trong PHP

Sự khác biệt giữa Interface và Abstract trong PHP

Interface và Abstract trong PHP cũng tương tự như trong các ngôn ngữ OOPs khác, một số điểm khác biệt chính giữa chúng như sau:

  • Trong các lớp Abstract, mọi phương thức không nhất thiết phải là abstract. Nhưng trong Interface, mọi phương thức đều phải là abstract.
  • Phương thức của Interface PHP phải là công khai, không thể có công cụ sửa đổi truy cập theo mặc định. Phương thức trong lớp abstract trong PHP có thể là công khai hoặc được bảo vệ.
  • Giao diện hỗ trợ đa kế thừa nhưng liều lượng lớp abstract không hỗ trợ đa kế thừa

Điều này có nghĩa là bạn có thể mở rộng một interface với một hoặc nhiều giao diện (nghĩa là đa kế thừa) như sau:

interface Interface_A { }

interface Interface_B { }

interface Interface_C { } 

interface MyInterface extends Interface_A, Interface_B, Interface_C { }

Trong ví dụ trên, có thể thấy chúng ta đang mở rộng MyInterface với ba interfaces khác là Interface_A, Interface_AInterface_C.

Bạn có thể thử mở rộng một lớp abstract như sau:

class Class_A { } 

abstract class MyAbstractClass extends Class_A {

}

Việc mở rộng trên không gặp khó khăn gì, nhưng giờ bạn có thể thử mở rộng một lớp abstract với chính xác một lớp nhưng nếu bạn cố thêm một lớp như dưới đây: 

class Class_A { }

class Class_B { } 

abstract class MyAbstractClass extends Class_A, Class_B {

}

Lúc này PHP sẽ báo lại một lỗi lạ mà không cho bạn biết bạn đang làm sai cái gì:

Parse error: syntax error, unexpected ',', expecting '{'
  • Interface không bao gồm constructor nhưng một abstract thì có.
  • Thành phần của một interface không thể ở dạng tĩnh, trong abstract chỉ những thành phần hoàn chỉnh mới có thể ở dạng tĩnh. Ví dụ như sau:
abstract class MyAbstractClass {    

 public static $foo = null;     

 public static function foo() {}

}

abstract class MyAbstractClass {    

 public static $foo = null;     

 abstract static function foo() {} // error

}

>>> Đọc thêm: Interface trong PHP - Tìm hiểu về giao diện Interface

Bảng so sánh Interface và Abstract trong PHP

 

Interface Abstract class Note
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

 

Kết luận: Trên đây là một vài so sánh giữa Interface và Abstract trong lập trình hướng đối tượng PHP. Hy vọng bạn có thể thấy rõ được sự khác biệt giữa hai khái niệm này. Cùng tìm hiểu thêm các kiến thức về lập trình qua các khóa học lập trình tại  tại Viện công nghệ thông tin T3H bạn nhé!