Menu
CoddyTech

Rút gọn hàm khởi tạo (8.0)

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 42 trên 91.

PHP 8.0 giới thiệu khai báo thuộc tính ngay trong hàm khởi tạo, một tính năng giúp giảm đáng kể đoạn code lặp lại khi định nghĩa lớp. Thay vì khai báo riêng các thuộc tính rồi gán giá trị cho chúng trong hàm khởi tạo, bạn có thể làm cả hai việc trong một bước.

Đây là cách tiếp cận truyền thống mà bạn đã dùng:

<?php
class Product {
    private string $name;
    private float $price;
    
    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

Với tính năng tự động tạo thuộc tính từ tham số của hàm khởi tạo, bạn thêm từ bổ trợ truy cập trực tiếp vào các tham số của hàm khởi tạo:

<?php
class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

$product = new Product("Laptop", 999.99);
echo $product->getInfo();

Đầu ra:

Laptop: $999.99

Khi thêm private, protected hoặc public trước tham số của hàm khởi tạo, PHP tự động tạo thuộc tính và gán giá trị. Bạn có thể kết hợp tham số được khai báo thuộc tính tự động với tham số thông thường trong cùng một hàm khởi tạo, đồng thời vẫn có thể thêm logic vào phần thân hàm khởi tạo nếu cần.

Điểm chính: Rút gọn thuộc tính trong hàm khởi tạo giúp loại bỏ các khai báo và phép gán thuộc tính lặp lại, khiến lớp gọn gàng và dễ đọc hơn mà vẫn giữ toàn quyền kiểm soát tính đóng gói.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống quản lý danh bạ để minh họa sự tinh gọn của tính năng khai báo thuộc tính qua hàm khởi tạo (constructor promotion). Bạn sẽ tạo một lớp PHP hiện đại, gọn gàng, giúp loại bỏ code rườm rà mà vẫn đảm bảo tính đóng gói.

Bạn sẽ sắp xếp code trong hai tệp:

  • Contact.php: Tạo lớp Contact bằng tính năng khai báo thuộc tính qua hàm khởi tạo, để định nghĩa tất cả thuộc tính ngay trong phần khai báo hàm khởi tạo. Danh bạ cần có:
    • Thuộc tính $name riêng tư (chuỗi)
    • Thuộc tính $email riêng tư (chuỗi)
    • Thuộc tính $phone riêng tư (chuỗi), có giá trị mặc định là "Not provided"
    Dùng cú pháp khai báo thuộc tính qua hàm khởi tạo: không cần khai báo thuộc tính riêng! Thêm phương thức công khai getFullDetails() để trả về "[name] | [email] | [phone]". Thêm phương thức getSummary() để trả về "Contact: [name]".
  • main.php: Nạp tệp Contact. Bạn sẽ nhận ba đầu vào: tên, email và số điện thoại. Tạo hai đối tượng Contact:
    • Danh bạ thứ nhất dùng cả ba giá trị (tên, email và số điện thoại)
    • Danh bạ thứ hai chỉ dùng tên và email (dùng giá trị số điện thoại mặc định)
    In ra bốn dòng:
    • Thông tin đầy đủ của danh bạ thứ nhất
    • Tóm tắt của danh bạ thứ nhất
    • Thông tin đầy đủ của danh bạ thứ hai
    • Tóm tắt của danh bạ thứ hai

Hãy chú ý cách tính năng khai báo thuộc tính qua hàm khởi tạo cho phép bạn định nghĩa thuộc tính, thiết lập phạm vi truy cập, khai báo kiểu dữ liệu và gán giá trị, tất cả trong một phần khai báo hàm khởi tạo dễ đọc. Tham số số điện thoại không bắt buộc, có giá trị mặc định, cho thấy các tham số được khai báo qua hàm khởi tạo hoạt động liền mạch với giá trị mặc định, giống như tham số thông thường.

Tự làm thử

<?php

require_once 'Contact.php';

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

// TODO: Tạo liên hệ thứ nhất với cả ba giá trị (name, email, phone)

// TODO: Tạo liên hệ thứ hai chỉ với name và email (dùng phone mặc định)

// TODO: In ra đầy đủ thông tin của liên hệ thứ nhất

// TODO: In ra thông tin tóm tắt của liên hệ thứ nhất

// TODO: In ra đầy đủ thông tin của liên hệ thứ hai

// TODO: In ra thông tin tóm tắt của liên hệ thứ hai

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