Kế thừa (Inheritance) là một trong những tính năng cốt lõi của lập trình hướng đối tượng (OOP), cho phép một class con kế thừa các thuộc tính và phương thức từ một class cha. Điều này giúp cho việc tái sử dụng mã, tăng tính linh hoạt và dễ bảo trì hơn trong quá trình phát triển phần mềm.

Trong PHP, kế thừa cho phép một class con mở rộng chức năng của class cha bằng cách kế thừa các đặc tính chung và tùy chỉnh thêm các phương thức hoặc thuộc tính riêng. Trong bài viết này, chúng ta sẽ khám phá cách sử dụng kế thừa trong PHP, cùng với các ví dụ minh họa cụ thể.

1. Kế thừa là gì?

Kế thừa trong OOP cho phép tạo ra các class mới từ các class hiện có. Class mới (class con) sẽ kế thừa các thuộc tính và phương thức từ class cha. Điều này có nghĩa là class con có thể sử dụng lại các chức năng từ class cha, đồng thời cũng có thể thêm mới hoặc ghi đè các phương thức để mở rộng hoặc thay đổi hành vi.

Trong PHP, để khai báo một class kế thừa từ class khác, chúng ta sử dụng từ khóa extends.

Cú pháp kế thừa trong PHP:

php
class ClassParent {
    // Các thuộc tính và phương thức của class cha
}

class ClassChildren extends ClassParent {
    // Các thuộc tính và phương thức của class con
}

2. Ví dụ về kế thừa trong PHP

Hãy xem một ví dụ đơn giản về việc sử dụng kế thừa:

php
class Animal {
    public $name;

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

    public function makeSound() {
        return "Some generic sound";
    }
}

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

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

// Tạo các đối tượng từ class con
$dog = new Dog("Buddy");
echo $dog->name . " says " . $dog->makeSound(); // Output: Buddy says Bark!

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

Giải thích:

  • Class Animal là class cha, với thuộc tính $name và phương thức makeSound().
  • Class DogCat là các class con kế thừa từ Animal. Cả hai class này ghi đè phương thức makeSound() để cung cấp hành vi riêng.
  • Khi tạo đối tượng từ class DogCat, đối tượng sẽ sử dụng phương thức makeSound() của chính nó, nhưng vẫn thừa hưởng thuộc tính $name từ class cha Animal.

3. Từ khóa parent trong kế thừa

Trong trường hợp class con muốn sử dụng phương thức hoặc thuộc tính của class cha nhưng vẫn muốn mở rộng hoặc thay đổi một phần chức năng, chúng ta có thể sử dụng từ khóa parent. Từ khóa parent cho phép class con gọi trực tiếp các phương thức hoặc thuộc tính của class cha.

Ví dụ sử dụng parent:

php
class Animal {
    public $name;

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

    public function makeSound() {
        return "Some generic sound";
    }
}

class Dog extends Animal {
    public function makeSound() {
        return parent::makeSound() . " and Bark!";
    }
}

// Tạo đối tượng từ class Dog
$dog = new Dog("Buddy");
echo $dog->name . " says " . $dog->makeSound(); // Output: Buddy says Some generic sound and Bark!

Giải thích:

  • Trong class Dog, chúng ta sử dụng parent::makeSound() để gọi phương thức makeSound() từ class cha Animal, sau đó thêm chuỗi " and Bark!" vào kết quả. Điều này cho phép class con kết hợp chức năng của class cha và thêm hành vi riêng.

4. Ghi đè phương thức (Method Overriding)

Khi class con có một phương thức cùng tên với phương thức của class cha, PHP sẽ tự động sử dụng phương thức của class con. Điều này được gọi là ghi đè phương thức (method overriding).

Ví dụ:

php
class Animal {
    public function makeSound() {
        return "Some generic sound";
    }
}

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

$dog = new Dog();
echo $dog->makeSound(); // Output: Bark!

Trong ví dụ trên, phương thức makeSound() của class Dog ghi đè phương thức cùng tên trong class Animal. Khi gọi makeSound() từ đối tượng của class Dog, PHP sẽ sử dụng phương thức của class con thay vì class cha.

5. Kế thừa các thuộc tính

Class con có thể kế thừa các thuộc tính từ class cha, và chúng có thể được truy cập tùy thuộc vào Access Modifiers của thuộc tính đó (public, protected, hoặc private).

  • Các thuộc tính publicprotected có thể truy cập từ class con.
  • Các thuộc tính private không thể truy cập trực tiếp từ class con, nhưng có thể truy cập thông qua các phương thức gettersetter của class cha.

Ví dụ:

php
class Vehicle {
    protected $speed;

    public function setSpeed($speed) {
        $this->speed = $speed;
    }

    public function getSpeed() {
        return $this->speed;
    }
}

class Car extends Vehicle {
    public function displaySpeed() {
        echo "The car is moving at " . $this->speed . " km/h";
    }
}

$myCar = new Car();
$myCar->setSpeed(120);
$myCar->displaySpeed(); // Output: The car is moving at 120 km/h

Giải thích:

  • Thuộc tính $speed của class Vehicle được khai báo là protected, có nghĩa là nó có thể được truy cập từ class Car (class con).
  • Phương thức displaySpeed() của class Car truy cập trực tiếp thuộc tính $speed của class cha Vehicle.

6. Kế thừa nhiều class (Multiple Inheritance)

PHP không hỗ trợ kế thừa nhiều class (multiple inheritance) một cách trực tiếp, tức là một class không thể kế thừa từ nhiều class cha cùng một lúc. Tuy nhiên, bạn có thể sử dụng traits để chia sẻ các phương thức giữa nhiều class (chúng ta sẽ tìm hiểu về trait trong bài học khác).

Ví dụ một class chỉ có thể kế thừa từ một class duy nhất:

php
class Parent1 {
    // Các thuộc tính và phương thức
}

class Parent2 {
    // Các thuộc tính và phương thức
}

class Child extends Parent1 {
    // Không thể kế thừa cả Parent1 và Parent2 cùng lúc
}

7. Lợi ích của kế thừa trong OOP

  • Tái sử dụng mã: Bạn có thể tái sử dụng các phương thức và thuộc tính đã được định nghĩa trong class cha mà không cần phải viết lại trong class con.
  • Giảm thiểu sự trùng lặp mã: Khi các phương thức và thuộc tính chung được định nghĩa trong class cha, các class con không cần phải lặp lại mã đó.
  • Tăng tính linh hoạt: class con có thể mở rộng hoặc ghi đè các phương thức của class cha để thay đổi hành vi mà không ảnh hưởng đến các phần khác của mã.
  • Dễ dàng bảo trì: Khi có thay đổi trong class cha, các class con tự động kế thừa những thay đổi đó mà không cần phải thay đổi từng class con.

Kết luận

Kế thừa là một tính năng mạnh mẽ của lập trình hướng đối tượng trong PHP. Nó cho phép bạn tái sử dụng mã, giảm thiểu sự trùng lặp, và tạo ra các class có khả năng mở rộng và linh hoạt. Bằng cách kế thừa các thuộc tính và phương thức từ class cha, class con có thể tùy chỉnh và mở rộng các tính năng mà không cần phải xây dựng lại từ đầu.

Trong bài học tiếp theo, chúng ta sẽ tìm hiểu sâu hơn về các khái niệm nâng cao khác trong PHP OOP như interfacesabstract classes, giúp xây dựng cấu trúc ứng dụng phức tạp hơn.