Từ khóa parent::
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 22 trên 91.
Khi một lớp con kế thừa từ lớp cha, đôi khi bạn cần truy cập trực tiếp vào các phương thức hoặc thuộc tính của lớp cha. Từ khóa parent:: cho phép bạn gọi phần triển khai của lớp cha từ bên trong lớp con.
Điều này đặc biệt hữu ích trong hàm khởi tạo (constructor) khi lớp con cần khởi tạo các thuộc tính của lớp cha đồng thời thiết lập các thuộc tính riêng:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
public function describe() {
return "$this->name is a $this->breed";
}
}
$dog = new Dog("Max", "Labrador");
echo $dog->describe();
Đầu ra:
Max is a LabradorBằng cách gọi parent::__construct($name), lớp con dùng lại logic khởi tạo của lớp cha thay vì viết lại logic đó. Nếu không có lời gọi này, thuộc tính $name sẽ không bao giờ được thiết lập.
Bạn có thể dùng parent:: để gọi bất kỳ phương thức nào của lớp cha, không chỉ hàm khởi tạo. Điều này đặc biệt quan trọng khi bạn muốn mở rộng cách hoạt động của một phương thức thay vì thay thế hoàn toàn phương thức đó.
Điểm chính: Từ khóa parent:: giúp truy cập phần triển khai của lớp cha. Từ khóa này rất cần thiết để nối tiếp các hàm khởi tạo (constructor) đúng cách và phát triển chức năng được kế thừa thay vì viết lại.
Thử thách
DễHãy xây dựng một hệ thống danh mục sản phẩm để minh họa cách lớp con có thể mở rộng chức năng của lớp cha thông qua từ khóa parent::, giúp gọi nối tiếp các hàm khởi tạo và phát triển dựa trên các phương thức được kế thừa.
Bạn sẽ sắp xếp code trong ba tệp:
Product.php: Định nghĩa lớpProduct, làm lớp cơ sở cho tất cả sản phẩm. Lớp này cần có các thuộc tính công khai$namevà$price. Hàm khởi tạo nhận tên và giá, rồi gán cả hai thuộc tính. Thêm phương thứcgetDetails()trả về"[name]: $[price]".ElectronicProduct.php: Định nghĩa lớpElectronicProductkế thừa lớpProduct. Thêm tệp Product ở đầu tệp. Lớp này bổ sung thuộc tính$warranty(tính theo tháng). Hàm khởi tạo nhận tên, giá và thời hạn bảo hành: dùngparent::__construct()để khởi tạo tên và giá thông qua lớp cha, sau đó tự gán thời hạn bảo hành. Tạo phương thứcgetDetails()phát triển dựa trên phần triển khai của lớp cha: gọiparent::getDetails()rồi nối thêm" (Warranty: [warranty] months)"vào kết quả.main.php: Thêm tệp ElectronicProduct. Bạn sẽ nhận ba đầu vào: tên sản phẩm, giá (dưới dạng chuỗi để chuyển thành số thực) và thời hạn bảo hành (dưới dạng chuỗi để chuyển thành số nguyên). Tạo một đối tượngElectronicProductvới các giá trị này rồi in ra kết quả của lời gọigetDetails().
Thử thách này cho thấy sức mạnh thực sự của parent::. Từ khóa này không chỉ dùng để gọi nối tiếp các hàm khởi tạo mà còn giúp mở rộng cách hoạt động của phương thức. ElectronicProduct sử dụng lại logic định dạng của lớp cha rồi bổ sung thông tin riêng, tránh lặp code mà vẫn tạo ra đầu ra phong phú hơn.
Tự làm thử
<?php
require_once 'ElectronicProduct.php';
// Đọc các giá trị đầu vào
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: Tạo một đối tượng ElectronicProduct từ các giá trị đầu vào
// và in ra kết quả khi gọi getDetails()
?>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