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.99Khi 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.
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ớpContactbằ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
$nameriêng tư (chuỗi) - Thuộc tính
$emailriêng tư (chuỗi) - Thuộc tính
$phoneriêng tư (chuỗi), có giá trị mặc định là"Not provided"
getFullDetails()để trả về"[name] | [email] | [phone]". Thêm phương thứcgetSummary()để trả về"Contact: [name]".- Thuộc tính
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ượngContact:- 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)
- 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
?>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