Triển khai nhiều giao diện
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 29 trên 91.
Không giống như kế thừa, trong đó một lớp chỉ có thể mở rộng một lớp cha, PHP cho phép một lớp triển khai nhiều giao diện. Điều này giúp bạn linh hoạt kết hợp các hợp đồng khác nhau, khiến lớp của bạn đa năng hơn.
Để triển khai nhiều giao diện, hãy phân tách chúng bằng dấu phẩy sau từ khóa implements:
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
private $title;
public function __construct($title) {
$this->title = $title;
}
public function print() {
return "Printing: " . $this->title;
}
public function save() {
return "Saving: " . $this->title;
}
}
$report = new Report("Sales Report");
echo $report->print() . "\n";
echo $report->save();
Đầu ra:
Printing: Sales Report
Saving: Sales ReportLớp Report đáp ứng cả hai hợp đồng bằng cách triển khai tất cả phương thức của Printable và Savable. Bạn phải cung cấp phần triển khai cho mọi phương thức được khai báo trong mỗi giao diện.
Cách tiếp cận này rất mạnh vì giúp bạn tạo các lớp đáp ứng nhiều yêu cầu cùng lúc mà không bị giới hạn bởi kế thừa đơn. Một lớp có thể in ra, lưu, xuất và làm nhiều việc khác cùng lúc.
Điểm chính: Dùng dấu phẩy để triển khai nhiều giao diện. Lớp của bạn phải cung cấp phần triển khai cụ thể cho tất cả phương thức từ mọi giao diện mà lớp triển khai.
Thử thách
DễHãy xây dựng một hệ thống tệp phương tiện để minh họa cách một lớp (class) có thể triển khai nhiều giao diện (interface) nhằm có được những khả năng khác nhau.
Bạn sẽ tạo bốn tệp phối hợp với nhau để xử lý các tệp phương tiện có thể vừa phát vừa chia sẻ:
Playable.php: Định nghĩa giao diệnPlayablevới một chữ ký phương thức duy nhất:play(). Hợp đồng này đảm bảo mọi phương tiện có thể phát đều có thể bắt đầu phát.Shareable.php: Định nghĩa giao diệnShareablevới một chữ ký phương thức duy nhất:share($platform). Hợp đồng này đảm bảo mọi nội dung có thể chia sẻ đều có thể được phân phối đến các nền tảng khác nhau.Video.php: Tạo lớpVideotriển khai cảPlayablelẫnShareable. Đưa cả hai tệp giao diện vào đầu tệp. Lớp này cần có thuộc tính riêng$titlevà thuộc tính riêng$duration(tính bằng phút). Hàm khởi tạo nhận tiêu đề và thời lượng. Triển khaiplay()để trả về"Playing video: [title] ([duration] min)". Triển khaishare($platform)để trả về"Sharing [title] on [platform]".main.php: Đưa tệp Video vào. Bạn sẽ nhận ba đầu vào: tiêu đề video, thời lượng (dưới dạng chuỗi cần chuyển thành số nguyên) và tên nền tảng. Tạo một đối tượngVideovới tiêu đề và thời lượng. In ra kết quả gọiplay()ở dòng đầu tiên, sau đó in ra kết quả gọishare()với nền tảng ở dòng thứ hai.
Lớp Video của bạn đồng thời đáp ứng hai hợp đồng riêng biệt. Lớp này có thể phát như mọi phương tiện khác và có thể chia sẻ lên các nền tảng mạng xã hội. Đó là sức mạnh của việc triển khai nhiều giao diện: một lớp duy nhất có được các khả năng từ nhiều nguồn khác nhau mà không bị giới hạn trong một chuỗi kế thừa duy nhất.
Tự làm thử
<?php
// Nạp tệp Video
require_once 'Video.php';
// Đọc dữ liệu đầu vào
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));
// TODO: Tạo đối tượng Video với tiêu đề và thời lượng
// TODO: In kết quả gọi play() trên dòng đầu tiên
// TODO: In kết quả gọi share() với nền tảng trên dòng 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