Lớp ẩn danh
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 58 trên 91.
Đôi khi, bạn cần một đối tượng đơn giản, dùng một lần mà không phải định nghĩa cả một lớp. Lớp ẩn danh cho phép bạn tạo đối tượng ngay tại chỗ, đúng nơi bạn cần. Chúng đặc biệt hữu ích khi kết hợp với cơ chế tiêm phụ thuộc.
Lớp ẩn danh được định nghĩa bằng new class, theo sau là phần thân lớp:
<?php
$logger = new class {
public function log(string $message): void {
echo "Log: $message";
}
};
$logger->log("Hello!");
Đầu ra:
Log: Hello!Lớp ẩn danh trở nên hữu ích khi triển khai các giao diện. Cách này rất phù hợp để kiểm thử hoặc khi bạn cần triển khai nhanh mà không làm rối codebase bằng những lớp chỉ dùng một lần:
<?php
interface Notifier {
public function send(string $message): string;
}
function notify(Notifier $notifier, string $msg): string {
return $notifier->send($msg);
}
$result = notify(new class implements Notifier {
public function send(string $message): string {
return "Sent: $message";
}
}, "Test message");
echo $result;
Đầu ra:
Sent: Test messageLớp ẩn danh cũng có thể kế thừa các lớp khác, sử dụng trait và nhận đối số cho hàm khởi tạo. Chúng có đầy đủ các tính năng của lập trình hướng đối tượng, chỉ khác là được định nghĩa ngay tại chỗ thay vì trong một tệp riêng. Hãy dùng chúng khi định nghĩa đầy đủ một lớp là không cần thiết, nhưng bạn vẫn cần hành vi hướng đối tượng.
Thử thách
DễHãy xây dựng một hệ thống định dạng dữ liệu để minh họa sức mạnh của lớp ẩn danh. Thay vì tạo các tệp lớp riêng cho những cách triển khai đơn giản, chỉ dùng một lần, bạn sẽ dùng lớp ẩn danh để tạo nhanh cách triển khai ngay tại nơi cần.
Bạn sẽ sắp xếp code trong hai tệp:
FormatterInterface.php: Định nghĩa một giao diện có tênFormatterInterfacevới một phương thức duy nhất làformat(string $data): string. Giao diện này quy định những gì mọi bộ định dạng phải tuân theo.main.php: Đưa tệp giao diện vào và tạo lớpDataProcessor, sử dụng kỹ thuật tiêm phụ thuộc để nhận bất kỳ bộ định dạng nào. Lớp này cần:- Nhận một
FormatterInterfacetrong hàm khởi tạo - Có phương thức
process(string $data)chuyển việc xử lý cho bộ định dạng được tiêm vào và trả về kết quả
Bạn sẽ nhận hai đầu vào: kiểu định dạng (
"upper"hoặc"reverse") và một chuỗi cần định dạng.Dựa trên kiểu định dạng, hãy tạo một lớp ẩn danh triển khai
FormatterInterface:- Với
"upper": phương thứcformat()cần trả về dữ liệu đã chuyển thành chữ in hoa - Với
"reverse": phương thứcformat()cần trả về dữ liệu theo thứ tự đảo ngược
Tiêm lớp ẩn danh vào một
DataProcessor, gọiprocess()với chuỗi đầu vào và in ra kết quả.- Nhận một
Cách này rất phù hợp khi bạn cần một cách triển khai nhanh mà không làm rối codebase bằng các tệp lớp chỉ dùng một lần. Lớp ẩn danh được tạo ngay tại chỗ, triển khai giao diện cần thiết và có thể truyền đến bất cứ nơi nào cần giao diện đó.
Tự làm thử
<?php
require_once 'FormatterInterface.php';
// TODO: Tạo lớp DataProcessor:
// Nhận một FormatterInterface trong hàm khởi tạo
// Có phương thức process(string $data) chuyển việc xử lý cho bộ định dạng
// Đọc đầu vào
$formatType = trim(fgets(STDIN));
$inputString = trim(fgets(STDIN));
// TODO: Dựa vào $formatType ("upper" hoặc "reverse"), tạo một lớp ẩn danh
// triển khai FormatterInterface
// Với "upper": format() trả về dữ liệu viết hoa
// Với "reverse": format() trả về dữ liệu đã đảo ngược
// TODO: Tạo DataProcessor với bộ định dạng là lớp ẩn danh bạn vừa tạo
// Gọi process() với chuỗi đầu vào và in ra kết quả
?>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 sinh10Các khái niệm OOP nâng cao
Kết hợp hay kế thừaTiêm phụ thuộcLớp ẩn danhKiểu liệt kê (PHP 8.1)Fiber (PHP 8.1)Tìm hiểu sâu về sao chép đối tượngBộ sinh và bộ lặp2Khô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