PHP - Lớp trừu tượng

Chào mừng bạn đến với hành trình vào thế giới lập trình PHP! Hôm nay, chúng ta sẽ cùng khám phá một trong những tính năng mạnh mẽ nhất của PHP: các lớp trừu tượng. Nhưng trước khi bắt đầu, hãy để tôi kể cho bạn một câu chuyện nhỏ về cách tôi lần đầu tiên học về các lớp trừu tượng.

PHP - Abstract Classes

Ngày xửa ngày xưa, trong một thị trấn nhỏ gọi là "Codeville", có một lập trình viên trẻ tên Alice muốn tạo một trò chơi. Cô ấy có một ý tưởng tuyệt vời cho một trò chơi phiêu lưu dựa trên văn bản, nhưng cô ấy cần xây dựng một số cấu trúc cơ bản trước. Đó là khi cô ấy phát hiện ra các lớp trừu tượng.

Alice rất phấn khích vì các lớp trừu tượng cho phép cô ấy xác định các hành vi và thuộc tính chung mà tất cả các nhân vật trong trò chơi của cô ấy sẽ chia sẻ. Cô ấy có thể tạo ra các lớp nhân vật cụ thể kế thừa từ các lớp trừu tượng này, đảm bảo rằng mỗi nhân vật có các thuộc tính và phương thức cần thiết mà không cần viết chúng từ đầu.

Bây giờ, hãy quay lại bài hướng dẫn của chúng ta. Trong PHP, một lớp trừu tượng là một lớp không thể được khởi tạo và được thiết kế để được mở rộng bởi các lớp khác. Nó có thể chứa cả phương thức trừu tượng (phương thức được khai báo mà không có việc thực hiện) và phương thức cụ thể (phương thức có việc thực hiện).

Ví dụ

Hãy bắt đầu với một ví dụ đơn giản để hiểu khái niệm về các lớp trừu tượng. Chúng ta sẽ tạo một lớp trừu tượng叫做 Animal và sau đó mở rộng nó để tạo ra hai lớp động vật cụ thể: DogCat.

abstract class Animal {
protected $name;

public function __construct($name) {
$this->name = $name;
}

abstract public function makeSound();

public function getName() {
return $this->name;
}
}

class Dog extends Animal {
public function makeSound() {
return "Woof!";
}
}

class Cat extends Animal {
public function makeSound() {
return "Meow!";
}
}

$dog = new Dog("Buddy");
echo $dog->getName() . " says: " . $dog->makeSound() . "\n"; // Output: Buddy says: Woof!

$cat = new Cat("Whiskers");
echo $cat->getName() . " says: " . $cat->makeSound() . "\n"; // Output: Whiskers says: Meow!

Trong ví dụ này, chúng ta có một lớp trừu tượng Animal với một constructor và một phương thức makeSound() cần được thực hiện bởi bất kỳ lớp nào mở rộng Animal. Phương thức getName() là một phương thức cụ thể, có nghĩa là nó có việc thực hiện và có thể được sử dụng trực tiếp bởi các thể hiện của lớp.

Lớp DogCat mở rộng lớp Animal và cung cấp việc thực hiện riêng của chúng cho phương thức makeSound(). Khi chúng ta tạo các thể hiện của DogCat, chúng ta có thể gọi phương thức makeSound(), phương thức này sẽ xuất ra âm thanh phù hợp cho từng động vật.

Sự khác biệt giữa Giao diện và Lớp trừu tượng trong PHP

Bây giờ bạn đã thấy cách các lớp trừu tượng hoạt động, hãy cùng so sánh chúng với các giao diện. Cả giao diện và lớp trừu tượng đều được sử dụng để xác định các hợp đồng cho các lớp, nhưng chúng có một số khác biệt quan trọng:

  1. Thực hiện: Một giao diện chỉ có thể chứa các phương thức trừu tượng (phương thức không có việc thực hiện), trong khi một lớp trừu tượng có thể chứa cả phương thức trừu tượng và phương thức cụ thể. Điều này có nghĩa là nếu bạn cần cung cấp một số hành vi mặc định trong hierachy lớp của bạn, bạn nên sử dụng một lớp trừu tượng. Nếu bạn chỉ muốn xác định một hợp đồng mà không có hành vi mặc định, hãy sử dụng một giao diện.

  2. Kế thừa nhiều: Một lớp có thể triển khai nhiều giao diện, nhưng nó chỉ có thể mở rộng một lớp trừu tượng. Điều này là vì PHP không hỗ trợ kế thừa nhiều cho các lớp, điều này có thể dẫn đến các phức tạp trong việc quản lý trạng thái chia sẻ và giải quyết phương thức.

  3. Thuộc tính: Giao diện không thể chứa thuộc tính, trong khi lớp trừu tượng có thể. Điều này có nghĩa là nếu bạn cần xác định các thuộc tính chia sẻ giữa nhiều lớp, bạn nên sử dụng một lớp trừu tượng.

  4. Mức độ khả見: Trong giao diện, tất cả các phương thức đều ngầm công khai. Trong lớp trừu tượng, bạn có thể xác định các phương thức với các mức độ khả見 khác nhau (công khai, bảo vệ hoặc riêng tư).

  5. Constructor: Giao diện không thể chứa constructor, vì chúng được thiết kế để xác định hành vi thay vì khởi tạo các đối tượng. Lớp trừu tượng có thể có constructor, cho phép bạn khởi tạo các thuộc tính chia sẻ hoặc thực hiện các nhiệm vụ thiết lập khi tạo một thể hiện của lớp con.

Nhớ rằng, sự lựa chọn giữa việc sử dụng giao diện hoặc lớp trừu tượng phụ thuộc vào yêu cầu cụ thể và mục tiêu thiết kế của bạn. Nếu bạn cần thực thi một hợp đồng严格 và đảm bảo rằng tất cả các lớp triển khai tuân theo một bộ phương thức nhất định, hãy sử dụng giao diện. Nếu bạn cần cung cấp hành vi mặc định hoặc các thuộc tính chia sẻ giữa nhiều lớp, hãy sử dụng lớp trừu tượng.

Đó là tất cả về giới thiệu các lớp trừu tượng trong PHP! Tôi hy vọng bài hướng dẫn này đã cung cấp cho bạn một sự hiểu biết tốt về cách chúng hoạt động và cách sử dụng chúng trong mã của bạn. Nhớ rằng, thực hành là cách tốt nhất để trở nên thành thạo, vì vậy hãy tiếp tục lập trình và thử nghiệm với các lớp trừu tượng để trở nên thoải mái hơn với chúng. Chúc bạn lập trình vui vẻ!

Credits: Image by storyset