Menu
CoddyTech

Kế thừa cơ bản

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 21 trên 91.

Kế thừa cho phép một lớp có các thuộc tính và phương thức từ một lớp khác. Thay vì viết lại cùng một đoạn code, bạn có thể tạo một lớp cơ sở chứa các chức năng dùng chung và để các lớp khác kế thừa từ lớp đó.

Lớp được kế thừa gọi là lớp cha (hoặc lớp cơ sở), còn lớp kế thừa gọi là lớp con. Bạn dùng từ khóa extends để thiết lập mối quan hệ này:

<?php
class Animal {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function speak() {
        return "$this->name makes a sound";
    }
}

class Dog extends Animal {
    public function fetch() {
        return "$this->name fetches the ball";
    }
}

$dog = new Dog("Buddy");
echo $dog->speak() . "\n";
echo $dog->fetch();

Đầu ra:

Buddy makes a sound
Buddy fetches the ball

Lớp Dog tự động có quyền truy cập vào thuộc tính $name, hàm khởi tạo và phương thức speak() từ Animal. Lớp này cũng định nghĩa phương thức fetch() riêng mà chỉ chó mới có.

Điều này tạo nên một hệ thống phân cấp rõ ràng: mọi chú chó đều là động vật, vì vậy để Dog kế thừa từ Animal là hợp lý. Lớp con có thể sử dụng mọi thứ từ lớp cha, đồng thời bổ sung hành vi riêng.

Ý chính: Tính kế thừa giúp tái sử dụng code và thiết lập mối quan hệ logic giữa các lớp. Lớp con kế thừa tất cả thành viên public và protected từ lớp cha, giảm trùng lặp và giúp bạn dễ bảo trì code hơn.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống phân cấp phương tiện để minh họa cách kế thừa cho phép các lớp con dùng chung chức năng từ lớp cha, đồng thời bổ sung hành vi chuyên biệt của riêng mình.

Bạn sẽ tổ chức code trong ba tệp:

  • Vehicle.php: Định nghĩa lớp Vehicle, đóng vai trò là lớp cha của mọi phương tiện. Lớp này cần có thuộc tính công khai $brand và hàm khởi tạo nhận rồi thiết lập nhãn hiệu. Thêm phương thức start() trả về "[brand] is starting" và phương thức stop() trả về "[brand] is stopping".
  • Motorcycle.php: Định nghĩa lớp Motorcycle kế thừa từ Vehicle. Thêm tệp Vehicle ở đầu tệp. Lớp Motorcycle không cần hàm khởi tạo riêng vì lớp này sẽ kế thừa hàm khởi tạo của lớp cha. Thêm phương thức wheelie() trả về "[brand] is doing a wheelie!". Đây là hành vi riêng của xe máy.
  • main.php: Thêm tệp Motorcycle, tệp này đã có Vehicle. Bạn sẽ nhận một đầu vào: nhãn hiệu xe máy. Tạo một đối tượng Motorcycle với nhãn hiệu này. In ra kết quả gọi start(), rồi đến wheelie(), rồi đến stop(), mỗi kết quả trên một dòng riêng.

Lưu ý rằng lớp Motorcycle tự động kế thừa thuộc tính $brand, hàm khởi tạo cùng hai phương thức start() và stop() từ Vehicle. Lớp con chỉ cần định nghĩa điểm riêng của mình, trong trường hợp này là khả năng làm động tác bốc đầu. Đây là sức mạnh của tính kế thừa: viết chức năng chung một lần trong lớp cha, rồi để các lớp con dùng lại và bổ sung những đặc điểm riêng.

Tự làm thử

<?php
// Nạp lớp Motorcycle (đã bao gồm Vehicle)
require_once 'Motorcycle.php';

// Đọc đầu vào
$brand = trim(fgets(STDIN));

// TODO: Tạo đối tượng Motorcycle với thương hiệu đã nhập

// TODO: In ra kết quả của start()

// TODO: In ra kết quả của wheelie()

// TODO: In ra kết quả của stop()
?>
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online