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 ballLớ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.
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ớpVehicle, đó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$brandvà hàm khởi tạo nhận rồi thiết lập nhãn hiệu. Thêm phương thứcstart()trả về"[brand] is starting"và phương thứcstop()trả về"[brand] is stopping".Motorcycle.php: Định nghĩa lớpMotorcyclekế 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ứcwheelie()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ượngMotorcyclevới nhãn hiệu này. In ra kết quả gọistart(), rồi đếnwheelie(), rồi đếnstop(), 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()
?>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
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa $thisPhương thứcThuộc tínhHàm khởi tạo (__construct)Hàm hủy (__destruct)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnTừ khóa parent::Ghi đè phương thứcTừ khóa finalLớp trừu tượngÔn tập: hệ thống phân cấp nhân viên7Đóng gói
Công khai, được bảo vệ, riêng tưTìm hiểu sâu về bộ điều chỉnh quyền truy cậpGetter và setterẨn thông tinRút gọn hàm khởi tạo (8.0)Ôn tập: hệ thống hồ sơ học sinh2Không gian tên và tự động nạp
Giới thiệu về không gian tênTừ khóa useChuẩn tự động nạp PSR-4Trình tự động nạp của ComposerÔn tập: dự án có tổ chức5Giao diện và hợp đồng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnGiao diện và lớp trừu tượngGợi ý kiểu với giao diệnÔn tập: Máy tính hình học8Phương thức ma thuật
Giới thiệu về phương thức ma thuật__toString và __debugInfo__get, __set, __isset, __unset__call và __callStatic__clone và sao chép đối tượng__serialize và __unserializeÔn tập: Bộ sưu tập tùy chỉnh3Thuộc tính của lớp
Thuộc tính instance và staticHằng số trong lớpPhương thức và thuộc tính staticThuộc tính private và protectedThuộc tính chỉ đọc (PHP 8.1)Ôn tập: Trình quản lý tài khoản ngân hàng6Đa hình
Xem lại việc ghi đè phương thứcĐa hình qua giao diệnGợi ý kiểu và kiểu hợpLiên kết tĩnh muộnÔn tập: bộ xử lý thanh toánTự luyện tập: Trình biên dịch PHP online