Trong lập trình hướng đối tượng (OOP), interface (giao diện) là một cấu trúc cho phép định nghĩa các phương thức mà một class phải triển khai, nhưng không cung cấp phần thân của các phương thức đó. Interface không chứa bất kỳ thuộc tính hay phương thức nào có phần thân, nó chỉ chứa tên các phương thức và yêu cầu class sử dụng phải cung cấp phần thân (triển khai) cho các phương thức đó.
Interface đóng vai trò như một hợp đồng (contract), đảm bảo rằng tất cả các class triển khai giao diện đều phải tuân thủ theo một cấu trúc nhất định. Điều này rất hữu ích trong việc xây dựng các ứng dụng lớn, giúp đảm bảo tính nhất quán và dễ bảo trì trong mã nguồn.
1. Interface trong PHP là gì?
Trong PHP, interface là một tập hợp các phương thức không có phần thân mà các class phải triển khai khi thực hiện interface đó. Interface giúp định nghĩa các phương thức mà một class phải có, nhưng không cung cấp cách thức hoạt động của các phương thức đó. Các class triển khai interface phải cung cấp phần thân cho tất cả các phương thức được khai báo trong interface.
Cú pháp khai báo interface
interface InterfaceName {
public function methodName1();
public function methodName2($param);
}- Từ khóa
interfaceđược sử dụng để khai báo một giao diện. - Các phương thức bên trong interface không có phần thân. Chúng chỉ định nghĩa tên và tham số.
- Tất cả các phương thức trong interface mặc định là public và không thể có các phương thức private hoặc protected.
2. Ví dụ về interface trong PHP
Dưới đây là một ví dụ cơ bản về việc sử dụng interface:
interface Animal {
public function makeSound();
public function move();
}
class Dog implements Animal {
public function makeSound() {
return "Bark";
}
public function move() {
return "Run";
}
}
class Bird implements Animal {
public function makeSound() {
return "Chirp";
}
public function move() {
return "Fly";
}
}
$dog = new Dog();
echo $dog->makeSound(); // Output: Bark
echo $dog->move(); // Output: Run
$bird = new Bird();
echo $bird->makeSound(); // Output: Chirp
echo $bird->move(); // Output: FlyGiải thích:
- Interface
Animalđịnh nghĩa hai phương thứcmakeSound()vàmove(). - Class
Dogvà classBirdtriển khai interfaceAnimalvà buộc phải triển khai cả hai phương thứcmakeSound()vàmove(). - Mỗi class cung cấp cách thức riêng để thực hiện các phương thức này, chẳng hạn như chó "bark" và chim "chirp".
3. Các đặc điểm của Interface
3.1. Interface không thể chứa thuộc tính
Interface không thể chứa bất kỳ thuộc tính nào. Chỉ các phương thức mới có thể được khai báo trong interface. Mục đích của interface là chỉ định ra các phương thức mà class phải có, không phải để lưu trữ dữ liệu.
interface Vehicle {
public function startEngine();
public function stopEngine();
}3.2. Một class có thể triển khai nhiều interface
PHP hỗ trợ đa kế thừa giao diện (multiple inheritance for interfaces), tức là một class có thể triển khai nhiều interface cùng lúc, giúp tăng tính linh hoạt trong thiết kế.
interface CanFly {
public function fly();
}
interface CanRun {
public function run();
}
class Bird implements CanFly, CanRun {
public function fly() {
return "Flying";
}
public function run() {
return "Running";
}
}
$bird = new Bird();
echo $bird->fly(); // Output: Flying
echo $bird->run(); // Output: RunningGiải thích:
- Class
Birdtriển khai hai interfaceCanFlyvàCanRun, do đó nó phải cung cấp phần thân cho cả hai phương thứcfly()vàrun(). - Điều này giúp bạn có thể chia nhỏ hành vi của các class thành các interface độc lập, và các class có thể kết hợp các hành vi từ nhiều interface.
3.3. Interface không thể có phương thức với phần thân
Tất cả các phương thức trong một interface đều không có phần thân. Interface chỉ đóng vai trò như một bản thiết kế, cung cấp các tên phương thức mà class phải tuân theo, không phải cách thức hoạt động của phương thức.
interface Logger {
public function log($message);
}3.4. Interface không thể khởi tạo đối tượng
Giống như class trừu tượng, interface không thể tạo đối tượng. Bạn chỉ có thể khởi tạo đối tượng từ các class triển khai interface đó.
interface Shape {
public function calculateArea();
}
// $shape = new Shape(); // Lỗi: không thể khởi tạo interface3.5. Interface và từ khóa implements
Để sử dụng interface, các class phải sử dụng từ khóa implements. Một class có thể triển khai một hoặc nhiều interface bằng cách sử dụng từ khóa này.
class Car implements Vehicle {
public function startEngine() {
echo "Engine started";
}
public function stopEngine() {
echo "Engine stopped";
}
}4. Interface và Kế thừa
Khi một class triển khai một interface, nó buộc phải cung cấp phần thân cho tất cả các phương thức của interface đó. Nếu không, PHP sẽ báo lỗi và bạn sẽ không thể khởi tạo đối tượng từ class đó.
Tuy nhiên, nếu một class trừu tượng triển khai một interface, class đó không bắt buộc phải triển khai các phương thức của interface ngay lập tức. Thay vào đó, các class con kế thừa từ class trừu tượng sẽ chịu trách nhiệm triển khai các phương thức còn thiếu.
Ví dụ:
interface Animal {
public function makeSound();
}
abstract class Mammal implements Animal {
abstract public function move();
}
class Dog extends Mammal {
public function makeSound() {
return "Bark";
}
public function move() {
return "Run";
}
}
$dog = new Dog();
echo $dog->makeSound(); // Output: Bark
echo $dog->move(); // Output: RunGiải thích:
- Class
Mammallà một class trừu tượng triển khai interfaceAnimal, nhưng không cung cấp phần thân cho phương thứcmakeSound(). - Class
Dogkế thừa từ classMammalvà bắt buộc phải triển khai tất cả các phương thức từ cảMammalvà interfaceAnimal.
5. Interface vs. Abstract Class
| Interface | Class trừu tượng (Abstract Class) |
|---|---|
| Chỉ chứa các phương thức không có phần thân. | Có thể chứa cả phương thức có phần thân và không có phần thân. |
| Class có thể triển khai nhiều interface. | Class chỉ có thể kế thừa từ một class trừu tượng. |
| Không thể có thuộc tính. | Có thể chứa thuộc tính. |
Phương thức luôn là public. | Phương thức có thể là public, protected, hoặc private. |
Khi nào nên sử dụng Interface?
- Sử dụng interface khi bạn muốn xây dựng một "hợp đồng" mà các class khác nhau phải tuân theo. Interface giúp đảm bảo rằng tất cả các class triển khai đều có các phương thức cụ thể, nhưng các class đó có thể thực hiện chúng theo cách riêng.
- Interface cũng rất hữu ích khi bạn muốn đa kế thừa, vì PHP không hỗ trợ đa kế thừa class (một class chỉ có thể kế thừa từ một class cha), nhưng một class có thể triển khai nhiều interface.
Khi nào nên sử dụng Abstract Class?
- Sử dụng class trừu tượng khi bạn có một số phương thức mà bạn muốn cung cấp phần thân mặc định cho các class con. Điều này cho phép các class con kế thừa phương thức của class cha, đồng thời có thể ghi đè nếu cần thiết.
- Class trừu tượng cũng thích hợp khi bạn muốn cung cấp cả thuộc tính và phương thức mà các class con có thể kế thừa.
6. Kết luận
Interface trong PHP là một công cụ mạnh mẽ để xây dựng các hợp đồng (contracts) mà các class phải tuân theo. Chúng cho phép định nghĩa các phương thức mà một class phải có, nhưng không xác định cách thức hoạt động của các phương thức đó, giúp tăng tính linh hoạt và mở rộng của ứng dụng.
Sử dụng interface giúp đảm bảo tính nhất quán trong các hệ thống lớn, đồng thời cho phép lập trình viên định nghĩa các chức năng một cách rõ ràng và dễ bảo trì. Khi kết hợp với các class trừu tượng, interface có thể giúp xây dựng các kiến trúc phần mềm mạnh mẽ và linh hoạt hơn.
Trong bài học tiếp theo, chúng ta sẽ khám phá cách Traits trong PHP hoạt động và cách sử dụng chúng để giải quyết một số vấn đề phức tạp trong lập trình OOP.








