Thuộc tính chỉ đọc (PHP 8.1)
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 19 trên 91.
PHP 8.1 giới thiệu thuộc tính readonly, chỉ có thể gán giá trị một lần và không thể thay đổi sau đó. Khác với hằng số, thuộc tính readonly được thiết lập khi khởi tạo đối tượng, thay vì khi định nghĩa lớp.
Bạn khai báo một thuộc tính chỉ đọc bằng cách thêm từ khóa readonly trước phần khai báo kiểu:
<?php
class User {
public readonly string $id;
public readonly string $name;
public function __construct(string $id, string $name) {
$this->id = $id;
$this->name = $name;
}
}
$user = new User("U001", "Alice");
echo $user->id . "\n";
echo $user->name;
Đầu ra:
U001
AliceSau khi được gán, nếu bạn cố thay đổi thuộc tính chỉ đọc, chương trình sẽ báo lỗi. Thuộc tính này rất phù hợp với những giá trị cần giữ nguyên trong suốt vòng đời của một đối tượng, như ID hoặc dấu thời gian tạo.
Thuộc tính readonly phải có khai báo kiểu dữ liệu và chỉ có thể được gán một lần, bên trong lớp khai báo thuộc tính đó (thường là trong hàm khởi tạo (constructor)). Khác với thuộc tính thông thường, thuộc tính readonly không thể nhận giá trị mặc định khi khai báo. Chúng hoạt động với mọi bộ điều chỉnh phạm vi hiển thị:
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
public function getCost(): float {
return $this->cost;
}
}
$product = new Product("ABC123", 29.99);
echo $product->sku;
Đầu ra:
ABC123Điểm chính: Thuộc tính chỉ đọc giúp dữ liệu bất biến ở cấp thuộc tính. Chúng phù hợp để lưu dữ liệu nhận diện một đối tượng hoặc không nên thay đổi sau khi tạo, kết hợp tính linh hoạt khi khởi tạo trong thời gian chạy với khả năng ngăn chặn các thay đổi ngoài ý muốn.
Thử thách
DễHãy xây dựng một hệ thống cấu hình bất biến, sử dụng các thuộc tính chỉ đọc để đảm bảo những cài đặt quan trọng không bị thay đổi ngoài ý muốn sau khi khởi tạo.
Bạn sẽ tạo hai tệp phối hợp với nhau để quản lý cấu hình ứng dụng:
Config.php: Định nghĩa lớpConfigđại diện cho cấu hình ứng dụng với các cài đặt bất biến. Lớp này cần có ba thuộc tính công khai chỉ đọc:string $appName,string $versionvàint $maxConnections. Dùng tính năng nâng cấp hàm khởi tạo để khai báo và khởi tạo cả ba thuộc tính chỉ đọc trong một định nghĩa hàm khởi tạo gọn gàng. Thêm phương thứcgetInfo()trả về một chuỗi theo định dạng"[appName] v[version] (max: [maxConnections] connections)".main.php: Nạp tệp lớp Config. Bạn sẽ nhận ba đầu vào: tên ứng dụng, phiên bản và số kết nối tối đa (dưới dạng chuỗi cần chuyển thành số nguyên). Tạo một đối tượngConfigbằng các giá trị này. In kết quả củagetInfo()trên dòng đầu tiên. Sau đó, in từng thuộc tính chỉ đọc trên một dòng riêng bằng cách truy cập trực tiếp: tên ứng dụng, phiên bản và số kết nối tối đa.
Các thuộc tính chỉ đọc đảm bảo rằng sau khi tạo cấu hình, các giá trị của cấu hình sẽ được cố định. Điều này rất phù hợp với những cài đặt cần giữ nguyên trong suốt thời gian ứng dụng chạy. Hãy chú ý cách kết hợp tính năng nâng cấp hàm khởi tạo với thuộc tính chỉ đọc giúp định nghĩa các đối tượng giá trị bất biến thật ngắn gọn.
Đầu ra của bạn cần hiển thị chuỗi thông tin đã định dạng, sau đó là giá trị của từng thuộc tính, qua đó cho thấy bạn vẫn có thể đọc các thuộc tính chỉ đọc từ bên ngoài lớp.
Tự làm thử
<?php
require_once 'Config.php';
// Đọc dữ liệu đầu vào
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));
// TODO: Tạo đối tượng Config bằng các giá trị đầu vào
// TODO: In ra kết quả của getInfo()
// TODO: In mỗi thuộc tính readonly trên một dòng riêng:
// - tên ứng dụng
// - phiên bản
// - số kết nối tối đa
?>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