Menu
CoddyTech

Giới thiệu về 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 27 trên 91.

Interface xác định một hợp đồng mà các lớp phải tuân theo. Khác với lớp trừu tượng có thể chứa cả phương thức trừu tượng lẫn phương thức cụ thể, interface chỉ khai báo chữ ký phương thức mà không có phần triển khai. Hãy xem interface như một lời hứa: mọi lớp triển khai interface đều cam kết cung cấp những phương thức cụ thể đó.

Bạn định nghĩa một interface bằng từ khóa interface:

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

Giao diện này quy định mọi lớp triển khai Printable phải có phương thức print(). Giao diện không quan tâm phương thức hoạt động như thế nào, chỉ cần phương thức đó tồn tại.

Đây là một ví dụ đơn giản cho thấy cấu trúc cơ bản:

<?php
interface Drivable {
    public function start();
    public function stop();
}

Lưu ý rằng các phương thức trong interface không có phần thân, chỉ có chữ ký kết thúc bằng dấu chấm phẩy. Tất cả phương thức trong interface đều mặc định là public, vì vậy bạn không thể dùng private hoặc protected.

Interface rất hữu ích vì chúng cho phép các lớp không liên quan chia sẻ hành vi chung. Car và Motorcycle có thể không có điểm chung nào về kế thừa, nhưng cả hai đều có thể triển khai Drivable để đảm bảo có các phương thức start() và stop().

Điểm chính: Interface quy định một lớp phải có những phương thức nào, chứ không quy định chúng hoạt động ra sao. Interface đặt ra một hợp đồng mà các lớp triển khai phải đáp ứng.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống nhắn tin đơn giản để làm quen với giao diện. Bạn sẽ định nghĩa một giao diện, quy định cách xử lý tin nhắn và làm nền tảng cho các lớp triển khai mà bạn sẽ tạo trong bài học tiếp theo.

Bạn sẽ sắp xếp code trong hai tệp:

  • Messageable.php: Định nghĩa một giao diện có tên Messageable, khai báo chữ ký của hai phương thức: compose($content) để tạo tin nhắn và deliver() để gửi tin nhắn. Hãy nhớ rằng phương thức trong giao diện không có phần thân, chỉ có chữ ký kết thúc bằng dấu chấm phẩy.
  • main.php: Tải tệp Messageable. Để xác minh giao diện được định nghĩa chính xác, hãy dùng hàm interface_exists() của PHP để kiểm tra xem Messageable có tồn tại hay không. Sau đó, dùng ReflectionClass để kiểm tra giao diện và liệt kê các phương thức của nó. Tạo một đối tượng phản chiếu của giao diện, lấy các phương thức bằng getMethods() (hàm này trả về các đối tượng ReflectionMethod) và in tên của từng phương thức bằng getName() trên một dòng riêng.

Đầu ra của bạn cần hiển thị tên của hai phương thức mà giao diện khai báo, mỗi tên trên một dòng riêng, theo thứ tự bạn đã định nghĩa.

Thử thách này chỉ tập trung vào việc định nghĩa giao diện, tức hợp đồng mà các lớp trong tương lai cần đáp ứng. Bạn xác định những phương thức nào phải tồn tại mà chưa cần quan tâm chúng hoạt động ra sao. Phần triển khai sẽ có trong bài học tiếp theo!

Tự làm thử

<?php
// Nạp tệp giao diện Messageable
require_once 'Messageable.php';

// TODO: Dùng interface_exists() để kiểm tra giao diện Messageable có tồn tại không

// TODO: Tạo đối tượng ReflectionClass cho giao diện Messageable

// TODO: Lấy các phương thức bằng getMethods()

// TODO: Duyệt qua các phương thức và in tên từng phương thức trên một dòng riêng

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