DANH MỤC: PHP HƯỚNG ĐỐI TƯỢNG

Bài 8: Interface trong PHP hướng đối tượng


Tiếp tục với series học lập trình PHP hướng đối tượng, bài này chúng ta sẽ tìm hiểu về interface template trong hướng đối tượng.

1, Interface là gì? và tính chất.

Interface là gì?

-Interface trong hướng đối tượng là một khuôn mẫu, giúp cho chúng ta tạo ra 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 (hay còn gọi là hằng) sẽ có trong đối tượng implement nó.

-Để khai báo interface trong PHP chúng ta dùng cú pháp:

interface InterfaceName
{
    //code
}

Trong đó: InterfaceName là tên của interface các bạn muốn đặt.

VD: Mình sẽ tạo ra interface DongVat.

interface DongVat
{
    //code
}

Tính chất của interface.

-Sau đây mình sẽ liệt kê ra các tính chất của interface:

  • Interface không phải là một đối tượng.
  • Trong interface chúng ta chỉ được khai báo phương thức chứ không được định nghĩa chúng.
  • Trong interface chúng ta có thể khai báo được hằng nhưng không thể khai báo biến.
  • Một interface không thể khởi tạo được (vì nó không phải là 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 có trong interface đó.
  • Một class có thể implement nhiều interface.
  • Các interface có thể kế thừa lẫn nhau.

2, Các ví dụ.

VD1: 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()
    {
        //
    }
}

VD2: Trong interface chúng ta chỉ được khai báo hằng 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;

}

VD3: Một interface không thể khởi tạo được.

interface DongVat
{
    //
}

//sai vì interface không thể khởi tạo được
$dongvat = new DongVat();

VD4: Các lớp implement lạ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 này đúng vì đã khai báo và định nghĩa lại phương thức getName
//trong interface
class ConTrau implements DongVat
{
    private $name;

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

//Class này sai vì chưa khai báo và định nghĩa lại phương thức getName
//trong interface
class ConBo implements DongVat
{
    private $name;

    public function setName($name)
    {
        $this->name = $name;
    }
}

VD5: 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;
    }
}

VD6: 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, Lời kết.

-Như vậy mình đã giới thiệu xong đến mọi người về interface trong hướng đối tượng nói chung và PHP nói riêng rồi, dựa vào bài này và bài trước đó (lớp trừu tượng abstract) các bạn hãy tự đưa ra cho mình các điểm khác nhau giữa interfaceabstract nhé! Bài tiếp theo chúng ta sẽ tìm hiểu về staticfinal trong hướng đối tượng.

Nguồn: Toidicode.com

Thông tin tác giả

Vũ Thanh Tài

Vũ Thanh Tài

The best way to learn is to share

Hãy tham gia group facebook để cùng giao lưu chia sẻ kiến thức! Tham Gia

Bình Luận

    • Bạn đi chơi với bạn gái, bạn đề ra các bước chuẩn bị như tắm, rửa, xịt nước hoa, làm tóc, vuốt keo . Và sau đó bạn thực hiện các bước đấy. 
      Cũng giống như vậy, interface là cái bước bạn lên kế hoạch, sau đó bạn chỉ cần dùng 1 class và extend lại interface này và thực hiện nó thôi. 
      Nhưng lưu ý đối với interface thì bạn phải overwrite lại toàn bộ phương thức của nó, tức là bạn phải thực hiện đầy đủ và không bỏ sót tắm, rửa, xịt nước hoa, làm tóc, vuốt keo. Đó cũng chính là điểm khác biệt của interface và class bình thường, vì class bình thường k cần phải overwrite lại toàn bộ phương thức của nó.
      Abstract class cũng giống như thế, nhưng nó khác với interface 1 điểm là: đối với abstract có thể khai báo thuộc tính( biến ), nhưng trong interface thì không được khai báo biến, chỉ có thể khai báo hằng. 
      Interface có thể được implement( triển khai ) bởi 1 class, các implement có thể extend nhau, 1 class có thể implement nhiều class

  • Tôi cũng đang tìm hiểu về vấn đề này, thực sự là chưa nắm được phương pháp thực hành, sử dụng. Nó có vẻ tương đồng với lớp trừu tượng, và tại sao chúng ta nên sử dụng? 

  • Một bài viết vớ vẩn. Ko giải thích được điều gì.

    Tác giả chỉ giải thích khi nào cách khai báo interface. Kiểu như khi viết PHP thì cần phải là <?php, mà ko đc là <php hay <ph

    Cái này chúng tôi ko cần biết. Cái cần giải thích là tại sao phải dùng interface, khi nào cần dùng và nó có vai trò gì, thì ko thể giải thích được.

    Tôi ví dụ:

    class ConNghe implements ConTrau{...} $x = new ConNghe; echo $x->getName();

    So với

    class ConNghe {...} $x = new ConNghe; echo $x->getName();

    Một cái có interface và một cái ko có interface, kết quả là như nhau. Vậy thì tại sao lại cần interface ở đây, chả lẽ cứ class nào cũng phang interface vô? Phải có lý do của nó chứ?

    • " Interface trong hướng đối tượng là một khuôn mẫu, giúp cho chúng ta tạo ra 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 (hay còn gọi là hằng) sẽ có trong đối tượng implement nó."
      -> Bạn có đọc hết bài không vậy?
       

    • Tôi thấy bạn đưa ra ví dụ nó ko hề có ý nghĩa gì. Tôi sẽ đưa ra một ví dụ cho thấy rõ sự khác biệt khi có và không có Interface:

      class A {
          function count(){
              return 5;
          }
      }

      class B implements Countable {
          function count(){
              return 5;
          }
      }

      $a = new A;
      echo count($a); //kết quả là 1

      $b = new B;
      echo count($b); //kết quả là 5

      2 kết quả giữa có và không có Interface là khác nhau, bạn giải thích như thế nào về điều này?

    • Bạn khai báo thêm 1 interface Countable dạng như sau:
       

      interface Countable{
          public function addCount($count);
      }

      Và chạy lại xem sao:

      => Interface định nghĩa ra khuôn mẫu, và những object nào implement nó thì đều phải khai báo lại những gì nó đã định nghĩa.

    • Đọc cho kĩ bài viết, cách sử dụng rồi hãy comment bạn ơi, chính bạn còn không hiểu còn chê bài viết vớ vẩn ?

  • Đúng là em ko biết khi nào dùng interface, dùng để làm gì, kiểu kiểu những câu hỏi vậy :)

  • Ở ví dụ 6 dòng return cuối cùng sao lại là:

    return self::SUNG;

    em chưa hiểu chổ này lắm bác nào giải thích e với.. Tks

  • có phải implements là để khai báo hàm không nhĩ chắc nó giống file header.h của C++ đúng không nhĩ , vd như mình tạo ra các func trong implements trước cho nó định nghĩa rồi và các class dùng các func được định sẳn trong implements để nó tối ưu hơn đúng không vậy anh :D