PHP - Kế Thừa: Hướng Dẫn Dành Cho Người Mới Bắt Đầu

Xin chào các pháp sư PHP tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị vào thế giới của kế thừa trong PHP. Đừng lo lắng nếu bạn là người mới bắt đầu lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, giải thích mọi thứ từng bước một. Vậy, hãy lấy một cốc cà phê (hoặc trà, nếu đó là sở thích của bạn), và chúng ta cùng bắt đầu!

PHP - Inheritance

Kế Thừa Là Gì?

Kế thừa giống như một cây gia đình cho các lớp trong PHP. Cũng như bạn có thể kế thừa đôi mắt của bà nội hoặc cảm xúc hài hước của cha bạn, trong lập trình, một lớp có thể kế thừa các thuộc tính và phương thức từ một lớp khác. Khái niệm này giúp chúng ta viết mã tổ chức hơn và có thể tái sử dụng.

Hãy tưởng tượng như bạn đang tạo một trò chơi video với các loại nhân vật khác nhau. Tất cả các nhân vật có thể chia sẻ một số đặc điểm cơ bản (như có tên hoặc điểm máu), nhưng mỗi loại nhân vật (như chiến binh hoặc pháp sư) có thể có các khả năng đặc biệt. Kế thừa cho phép chúng ta xác định các đặc điểm chung trong một lớp cơ bản và sau đó tạo các lớp nhân vật cụ thể kế thừa các đặc điểm này và thêm các tính năng độc đáo của riêng chúng.

Ví Dụ Kế Thừa Cơ Bản

Hãy bắt đầu với một ví dụ đơn giản để xem cách kế thừa hoạt động trong PHP.

class Animal {
public $name;

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

public function speak() {
echo "The animal makes a sound.";
}
}

class Dog extends Animal {
public function speak() {
echo $this->name . " barks: Woof woof!";
}
}

$myDog = new Dog("Buddy");
$myDog->speak(); // Output: Buddy barks: Woof woof!

Trong ví dụ này, chúng ta có hai lớp: AnimalDog. Lớp Dog kế thừa lớp Animal, có nghĩa là nó kế thừa tất cả các thuộc tính và phương thức của Animal.

Hãy phân tích nó:

  1. Chúng ta xác định một lớp cơ bản Animal với một thuộc tính $name và một phương thức speak().
  2. Chúng ta tạo một lớp Dog kế thừa Animal bằng từ khóa extends.
  3. Lớp Dog ghi đè phương thức speak() với việc triển khai riêng của nó.
  4. Chúng ta tạo một đối tượng Dog tên là "Buddy" và gọi phương thức speak() của nó.

Lớp Dog kế thừa thuộc tính $name từ Animal, nhưng cung cấp phiên bản riêng của phương thức speak(). Điều này được gọi là ghi đè phương thức, và nó là một tính năng mạnh mẽ của kế thừa.

Kế Thừa và các Modifier Truy cập

Bây giờ, hãy nói về cách kế thừa hoạt động với các modifier truy cập khác nhau (public, protected, và private).

class Vehicle {
public $brand;
protected $model;
private $serialNumber;

public function __construct($brand, $model, $serialNumber) {
$this->brand = $brand;
$this->model = $model;
$this->serialNumber = $serialNumber;
}

public function getInfo() {
return "Brand: " . $this->brand . ", Model: " . $this->model;
}

protected function getSerialNumber() {
return $this->serialNumber;
}
}

class Car extends Vehicle {
public $doors;

public function __construct($brand, $model, $serialNumber, $doors) {
parent::__construct($brand, $model, $serialNumber);
$this->doors = $doors;
}

public function getFullInfo() {
return $this->getInfo() . ", Doors: " . $this->doors . ", SN: " . $this->getSerialNumber();
}
}

$myCar = new Car("Toyota", "Corolla", "ABC123", 4);
echo $myCar->getFullInfo();
// Output: Brand: Toyota, Model: Corolla, Doors: 4, SN: ABC123

Trong ví dụ này:

  1. Lớp Vehicle có các thuộc tính với các modifier truy cập khác nhau.
  2. Lớp Car kế thừa Vehicle và thêm thuộc tính riêng của nó ($doors).
  3. Lớp Car có thể truy cập các thành viên public và protected của Vehicle, nhưng không thể truy cập các thành viên private.
  4. Chúng ta sử dụng parent::__construct() để gọi constructor của lớp cha.

Lưu ý:

  • Các thành viên public có thể truy cập từ bất kỳ đâu.
  • Các thành viên protected có thể truy cập trong lớp và các lớp con.
  • Các thành viên private chỉ có thể truy cập trong lớp được định nghĩa.

Constructor trong Kế Thừa

Hãy cùng tìm hiểu sâu hơn về cách constructor hoạt động trong kế thừa:

class Shape {
protected $color;

public function __construct($color) {
$this->color = $color;
echo "Shape constructor called.<br>";
}
}

class Circle extends Shape {
private $radius;

public function __construct($color, $radius) {
parent::__construct($color);
$this->radius = $radius;
echo "Circle constructor called.<br>";
}

public function getInfo() {
return "A {$this->color} circle with radius {$this->radius}";
}
}

$myCircle = new Circle("red", 5);
echo $myCircle->getInfo();

Output:

Shape constructor called.
Circle constructor called.
A red circle with radius 5

Đây là những gì đang xảy ra:

  1. Khi chúng ta tạo một đối tượng Circle, PHP đầu tiên gọi constructor của Shape (lớp cha).
  2. Sau đó, nó gọi constructor của Circle.
  3. Chúng ta sử dụng parent::__construct($color) để đảm bảo constructor của Shape được gọi và thuộc tính $color được đặt.
  4. Cuối cùng, chúng ta đặt thuộc tính $radius đặc trưng cho lớp Circle.

Điều này đảm bảo rằng cả lớp cha và lớp con đều được khởi tạo đúng cách.

Bảng Tham Chiếu Phương Thức

Dưới đây là bảng tham chiếu các phương thức chúng ta đã sử dụng trong các ví dụ:

Phương Thức Mô Tả
__construct() Phương thức constructor, được gọi khi một đối tượng được tạo ra
speak() Phương thức để làm cho một con vật nói
getInfo() Phương thức để lấy thông tin cơ bản về một phương tiện
getSerialNumber() Phương thức protected để lấy số serial của một phương tiện
getFullInfo() Phương thức để lấy thông tin đầy đủ về một chiếc xe

Kết Luận

Kế thừa là một công cụ mạnh mẽ trong PHP cho phép chúng ta tạo ra các hierarchies của các lớp, thúc đẩy việc tái sử dụng và tổ chức mã. Nhớ rằng, nó giống như xây dựng với các mảnh LEGO - bạn bắt đầu với một mảnh cơ bản và tiếp tục thêm các mảnh cụ thể lên trên.

Khi bạn tiếp tục hành trình học PHP, bạn sẽ tìm thấy nhiều cách thú vị khác để sử dụng kế thừa. Hãy tiếp tục thực hành, và sớm bạn sẽ tạo ra các chương trình hướng đối tượng phức tạp và hiệu quả một cách dễ dàng!

Chúc mừng coding, các nhà vô địch PHP tương lai! ??‍??‍?

Credits: Image by storyset