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 WorldLớ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: $150Cả 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ý.
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 interfaceMessageablevớ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ớpEmailtriển khaiMessageable. Thêm tệp interface ở đầu tệp. Lớp này cần có thuộc tính$recipientriêng tư và thuộc tính$bodyriêng tư. Hàm khởi tạo nhận địa chỉ người nhận. Triển khaicompose($content)để lưu nội dung vào$bodyvà trả về"Email composed". Triển khaideliver()để trả về"Email to [recipient]: [body]".SMS.php: Tạo lớpSMScũng triển khaiMessageable. Thêm tệp interface ở đầu tệp. Lớp này cần có thuộc tính$phoneNumberriêng tư và thuộc tính$textriêng tư. Hàm khởi tạo nhận số điện thoại. Triển khaicompose($content)để lưu nội dung vào$textvà trả về"SMS composed". Triển khaideliver()để 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
?>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