1. Interface trong PHP là gì?

Interface có thể coi là giao diện trong PHP là một khuôn mẫu, giúp ta tạo ra một bộ khung cho một hoặc nhiều đối tượng và nhìn vào interface thì chúng ta hoàn toàn có thể xác định được các phương thức và các thuộc tính cố định sẽ có trong đối tượng implement đó. Interface giúp ta dễ dàng sử dụng nhiều lớp khác nhau theo cùng một cách. Các interface sẽ được khai báo bằng từ khóa interface. Để triển khai một giao diện thì một lớp cần phải sử dụng từ khóa implements.

Cú pháp khai báo:

interface InterfaceName
{
//interfaceName là tên của interface mà ta muốn đặt
}

Interface có một số tính chất:

  • Không phải là một đối tượng.
  • Trong Interface ta chỉ được khai báo phương thức chứ không được định nghĩa chúng.
  • Một Interface không thể khởi tạo được vì nó không phải một đối tượng.
  • Các lớp implement Interface thì phải khai báo và định nghĩa lại các phương thức trong Interface đó.
  • Một class có thể có implement nhiều Interface.
  • Các Interface có thể kế thừa lẫn nhau.

2. Một số ví dụ về interface trong PHP

Ví dụ 1: chỉ được khai báo phương thức chứ không được định nghĩa chúng trong interface.

interface DongVat
{
    //đúng vì chúng ta chỉ khai báo phương thức trong interface
    public function setName();

    //Sai vì chúng ta không được định nghĩa phương thức trong interface
    public function getName()
    {
        //
    }
}

Ví dụ 2: trong interface chúng ta chỉ có thể khai báo hằng chứ không thể khai báo biến

interface DongVat
{
    //đúng vì trong interface có thể khai báo hằng
    const CONNGUOI = False;

    //Sai vì trong interface không thể khai báo biến
    public $name;

}

Ví dụ 3: một interface không thể khởi tạo được

interface DongVat { // }

Ví dụ 4: các lớp implement tại interface thì phải khai báo và định nghĩa lại các phương thức có trong interface.

interface DongVat
{
    public function getName();
}
class ConTrau implements DongVat
{
    private $name;

    public function getName()
    {
        return $this->name;
    }
}

Ví dụ 5: một class có thể implement nhiều interface.

interface DongVat
{
    public function getName();
}

interface ConTrau
{
    public function checkSung();
}

class ConNghe implements DongVat, ConTrau
{
    private $name;

    const SUNG = false;

    public function getName()
    {
        return $this->name;
    }

    public function checkSung()
    {
        return self::SUNG;
    }
}

Ví dụ 6: interface có thể kế thừa lẫn nhau

interface DongVat
{
    public function getName();
}

interface ConTrau extends Dongvat
{
    public function checkSung();
}

class ConNghe implements ConTrau
{
    private $name;
    const SUNG = false;

    public function getName()
    {
        return $this->name;
    }

    public function checkSung()
    {
        return self::SUNG;
    }
}

3. Tính kế thừa interface trong PHP

Interface tuy không phải là một lớp nhưng nó cũng có tính chất là kết thừa. Một interface có thể kế thừa một interface khác và lúc này đối tượng nào implement kế thừa thì nó phải định nghĩa tất cả các hàm mà cả các hàm mà cả 2 lớp đã khai báo.

Ví dụ:

interface A {
    public function funcA();
}
interface B extends A
{
    public function funcB();
}
// Lớp này đúng vì nó khai báo đầy
// đủ các hàm trong A và B
class C implements B
{
    public function funcA() {
}
  
    public function funcB()
    {
    }
}
  
// Lớp này sai vì nó khai báo mỗi hàm funcA
class D implements B
{
    public function funcA()
    {
    }
}

4. So sánh giữa Interface và abstract class trong PHP

4.1. Giống nhau

Interface và abstract class có một số điểm giống nhau là đều không thể khởi tạo đối tượng và đều có thể chứa phương thức abstract.

4.2. Khác nhau

Ta sẽ so sánh những điểm khác nhau thông qua bảng sau

Interface Abstract class
Chỉ có thể kế thừa nhiều interface khác Có thể kế thừa một lớp và nhiều interface.
Chỉ chứa các khai báo và không có phần nội dung. Có thể chứa các thuộc tính thường và phương thức bình thường bên trong.
Không có contructor và cũng không có destructor. Có contructor và destructor
Phạm vi truy cập mặc định là public Có thể là protected
Dùng để định nghĩa một khuôn mẫu hoặc quy tắc riêng. Dùng để định nghĩa cốt lõi của lớp , thành phần chung của lớp và sử dụng cho nhiều đối tượng cùng kiểu.
Cần thời gian để tìm phương thức thực tế tương ứng với lớp dẫn đến thời gian chậm hơn một chút. Nhanh hơn so với interface.
Khi ta thêm mới 1 khai báo, ta phải tìm hết tất cả các lớp có thực thi interface này để định nghĩa nội dung cho phương thức mới. Khi định nghĩa một phương thức mới ta hoàn toàn có thể định nghĩa lại nội dung phương thức là rỗng hoặc những thực thi mặc định nào đó. Vì thế mà hệ thống vẫn chạy bình thường.