Menu
CoddyTech

Triển khai 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 28 trên 91.

Giờ bạn đã hiểu interface là gì, hãy cùng xem cách triển khai chúng. Một lớp triển khai interface bằng từ khóa implements và phải cung cấp phần triển khai cụ thể cho tất cả phương thức được khai báo trong interface đó.

<?php
interface Printable {
    public function print();
}

class Document implements Printable {
    private $content;
    
    public function __construct($content) {
        $this->content = $content;
    }
    
    public function print() {
        return "Printing: " . $this->content;
    }
}

$doc = new Document("Hello World");
echo $doc->print();

Đầu ra:

Printing: Hello World

Lớp Document triển khai Printable bằng cách cung cấp phiên bản riêng của phương thức print(). Nếu bạn quên triển khai một phương thức bắt buộc, PHP sẽ báo lỗi nghiêm trọng.

Các lớp khác nhau có thể triển khai cùng một giao diện theo cách riêng:

<?php
class Invoice implements Printable {
    private $amount;
    
    public function __construct($amount) {
        $this->amount = $amount;
    }
    
    public function print() {
        return "Invoice Total: $" . $this->amount;
    }
}

$invoice = new Invoice(150);
echo $invoice->print();

Đầu ra:

Invoice Total: $150

Cả Document và Invoice đều đáp ứng hợp đồng Printable, nhưng mỗi lớp xử lý việc in theo cách khác nhau tùy vào mục đích.

Điểm chính: Dùng implements để kết nối một lớp với một interface, sau đó định nghĩa tất cả phương thức bắt buộc. Mỗi lớp triển khai cung cấp logic riêng, đồng thời đảm bảo các phương thức có cùng chữ ký.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống nhắn tin để minh họa cách các lớp khác nhau có thể triển khai cùng một interface theo cách riêng của chúng.

Bạn sẽ tạo ba tệp phối hợp với nhau để xử lý các loại tin nhắn khác nhau:

  • Messageable.php: Định nghĩa interface Messageable với hai chữ ký phương thức: compose($content) và deliver(). Interface này thiết lập hợp đồng mà tất cả các loại tin nhắn phải tuân theo.
  • Email.php: Tạo lớp Email triển khai Messageable. Thêm tệp interface ở đầu tệp. Lớp này cần có thuộc tính $recipient riêng tư và thuộc tính $body riêng tư. Hàm khởi tạo nhận địa chỉ người nhận. Triển khai compose($content) để lưu nội dung vào $body và trả về "Email composed". Triển khai deliver() để trả về "Email to [recipient]: [body]".
  • SMS.php: Tạo lớp SMS cũng triển khai Messageable. Thêm tệp interface ở đầu tệp. Lớp này cần có thuộc tính $phoneNumber riêng tư và thuộc tính $text riêng tư. Hàm khởi tạo nhận số điện thoại. Triển khai compose($content) để lưu nội dung vào $text và trả về "SMS composed". Triển khai deliver() để trả về "SMS to [phoneNumber]: [text]".

Trong main.php, thêm cả hai tệp Email và SMS. Bạn sẽ nhận ba đầu vào: địa chỉ email, số điện thoại và nội dung tin nhắn. Tạo một đối tượng Email bằng địa chỉ email và một đối tượng SMS bằng số điện thoại. Gọi compose() với nội dung tin nhắn trên cả hai đối tượng, rồi in kết quả của mỗi lời gọi trên một dòng riêng. Sau đó, gọi deliver() trên cả hai đối tượng và in kết quả của mỗi lời gọi trên một dòng riêng. Thứ tự là: compose của email, compose của SMS, deliver của email, deliver của SMS.

Cả hai lớp đều tuân theo cùng một hợp đồng Messageable, nhưng mỗi lớp xử lý việc soạn và gửi tin nhắn theo mục đích riêng: email hiển thị địa chỉ người nhận, còn tin nhắn SMS hiển thị số điện thoại.

Tự làm thử

<?php
require_once 'Email.php';
require_once 'SMS.php';

// Đọc dữ liệu đầu vào
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));

// TODO: Tạo đối tượng Email bằng địa chỉ email

// TODO: Tạo đối tượng SMS bằng số điện thoại

// TODO: Gọi compose() trên cả hai đối tượng và in kết quả
// Thứ tự: gọi compose() trên Email, rồi trên SMS

// TODO: Gọi deliver() trên cả hai đối tượng và in kết quả
// Thứ tự: gọi deliver() trên Email, rồi trên SMS
?>
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