Menu
CoddyTech

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 Labrador

Bằ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.

challenge icon

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ớp Product, 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 $name và $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ức getDetails() trả về "[name]: $[price]".
  • ElectronicProduct.php: Định nghĩa lớp ElectronicProduct kế thừa lớp Product. 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ùng parent::__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ức getDetails() phát triển dựa trên phần triển khai của lớp cha: gọi parent::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ượng ElectronicProduct với các giá trị này rồi in ra kết quả của lời gọi getDetails().

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()

?>
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