Lớp trừu tượng (abstract class) và interface trong PHP

Đây là bài 34/53 bài của series môn học Lập trình Web PHP

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 Cài đặt môi trường lập trình Web PHP với XAMPP để biết cách chạy ứng dụng web PHP với XAMPP.

1. Lớp trừu tượng (abstract class) trong PHP

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ụ:

<?php
// Abstract class
abstract class Base {
    // This is abstract function
    abstract function printdata();
    // This is not abstract function
    function info() {
        echo "Base class";
    }
}
// Child class
class Derived extends Base {
    function printdata() {
        echo "Derived class";
    }
}
?>

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.

<?php
// Interface definition
interface Animal {
    public function makeSound();
}
?>

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

<?php
// Interface definition
interface Animal {
  public function makeSound();
}

// Class definitions
class Cat implements Animal {
  public function makeSound() {
    echo " Meow ";
  }
}

class Dog implements Animal {
  public function makeSound() {
    echo " Bark ";
  }
}

class Mouse implements Animal {
  public function makeSound() {
    echo " Squeak ";
  }
}

// Create a list of animals
$cat = new Cat();
$dog = new Dog();
$mouse = new Mouse();
$animals = array($cat, $dog, $mouse);

// Tell the animals to make a sound
foreach($animals as $animal) {
  $animal->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

Interfaceabstract 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 interfaceabstract 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 classpublic hoặc protected.
    • Tất cả phương thức trong interfaceabstract. 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ề interfaceabstract 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.

5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Tính kế thừa (inheritance) trong PHPTrait là gì? Cách sử dụng Trait trong PHP >>
Chia sẻ trên mạng xã hội:

Để lại một bình luận

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.