Menu
CoddyTech

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 Report

Lớ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.

challenge icon

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ện Playable vớ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ện Shareable vớ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ớp Video triển khai cả Playable lẫn Shareable. Đư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 $title và 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 khai play() để trả về "Playing video: [title] ([duration] min)". Triển khai share($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ượng Video với tiêu đề và thời lượng. In ra kết quả gọi play() ở dòng đầu tiên, sau đó in ra kết quả gọi share() 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

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