Lập Trình Hướng Đối Tượng-PHP [Phần 2] Abstract Class Interface và hàm static.

0

Sự khác biệt giữa Abstract Class và Interface

Chắc chắn rằng khi làm việc với lập trình hướng đối tương (OOP) có hai khái niệm mà các bạn đã thấy đó là Abstract và Interface. Tuy nhiên nhiên đa số có vẻ còn khá mơ hồ khi phân biệt chúng. Và đơn giản hai khái niệm được định nghĩa như sau:

Abstract class

  •  Lớp trừu tượng đơn giản được xem như một class cha cho tất cả các Class có cùng bản chất. Do đó mỗi lớp dẫn xuất (lớp con) chỉ có thể kế thừa từ một lớp trừu tượng. Bên cạnh đó nó không cho phép tạo instance, nghĩa là sẽ không thể tạo được các đối tượng thuộc lớp đó.

Interface

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ó.

  • Đặc điểm của interface

    • Chỉ chứa khai báo không chứa phần định nghĩa (giống phương thức thuần ảo). Mặc dù giống phương thức thuần ảo nhưng bạn không cần phải khai báo từ khoá abstract.
    • Interface không chứa các thuộc tính (các biến) dù là hằng số hay biến tĩnh vẫn không được.
    • Interface không có constructor cũng không có destructor.
    • Các lớp có thể thực thi nhiều interface cùng lúc (ở 1 góc độ nào đó có thể nó là phương án thay thế đa kế thừa).
    • Một interface có thể kế thừa nhiều interface khác nhưng không thể kế thừa bất kỳ lớp nào.

    Mục đích sử dụng interface

    • Trong 1 hệ thống việc trao đổi thông tin giữa các thành phần cần được đồng bộ và có những thống nhất chung. Vì thế dùng interface sẽ giúp đưa ra những quy tắc chung mà bắt buộc các thành phần trong hệ thống này phải làm theo mới có thể trao đổi với nhau được.

Bất kỳ lớp nào sử dụng lớp interface đều phải định nghĩa các phương thức đã khai báo ở lớp interface, nếu cố tình không khai báo thì PHP sẽ báo lỗi, để sử dụng lớp interface bạn chỉ việc khai báo với từ khóa implements và một lớp có thể sử dụng nhiều interface cũng như vừa có thể kế thừa từ lớp khác và đồng thời sử dụng interface.

Ví dụ:

interface a{
    public function pa();
}
interface b{
    public function pb();
}
class c{
    public function pc(){
        echo 'phuong thuc pc cua lop c';
    }
}
class d extends c implements a,b{
    public function pa(){
        echo 'phuong thuc pa duoc khai bao interface';
    }
    public function pb(){
        echo 'phuong thuc pb duoc khai bao interface';
    }
    public function pd(){
        echo 'phuong thuc pc cua lop d';
    }
}
$s = new d();
$s->pc();

Trong lớp abstract chứa các phương thức abstract chúng cũng rỗng giống như phương thức trong interface, vậy nên khi một lớp kế thừa từ lớp asbtract thì bắt buộc phải định nghĩa phương thức đã khai báo ở lớp abstract.

Một lớp abstract khi sử dụng cũng như kế thừa bạn khai báo với từ khóa "extends" điều này không giống như interface. Ví dụ:

abstract class a{
    protected $vara = 'pa2() cua lop a';
    abstract function pa();
    protected function pa2(){
        return $this->vara;
    }
}
class b extends a{
    public function pa(){
        echo 'pa() duoc khai bao abtract o lop a';
    }
    public function pb(){
        echo $this->pa2();
    }
}
$s = new b();
$s->pb();

Cuối cùng, cũng nên liệt kê các điểm khác biệt giữa hai khái niệm này để bạn có thể sử dụng được khi cần thiết. Các điểm khác biệt này có thể khác nhau tùy vào ngôn ngữ mà bạn sử dụng. Vì vậy bạn chỉ cần nhớ các điểm căn bản sau:

 InterfaceAbstract class
Multiple inheritanceMột class có thể hiện thực nhiều interface.(tạm coi là thừa kế)Không hỗ trợ đa thừa kế
Access ModifiersMọi phương thức, property đều mặc định là public.Có thể xác định modifier.
Adding functionalityMọi phương thức, property của interface cần được hiện thực trong class.Không cần thiết.
Fields and ConstantsKhông

Thế nào là một hàm static. Phân biệt cách dùng từ khoá static::method() với self::method()

Thế nào là một hàm static? Hàm static là hàm có thể được gọi mà không cần một đối tượng của class đó. Static nó hoạt động như một biến toàn cục dù cho nó có được xử lý ở trong bất kỳ một file nào đi nữa (trong cùng một chương trình) thì nó đều lưu lại giá trị cuối cùng mà nó được thực hiện vào trong lớp. Và cũng vì điều này mà khi sử dụng static trong chương trình thì nó sẽ chiếm nhiều tài nguyên hơn các thành phần thường. Phân biệt cách dùng từ khoá static::method() với self::method()

  • self::method() tham chiếu đến hàm method tại thời điểm nó được định nghĩa.
  • static::method() tham chiếu đến hàm method tại thời điểm nó được gọi.
class A
{
   public static function test()
   {
       echo 'a';
   }
   public static function run()
   {
       self::test();    // always a
       static::test(); // depend on called class
   }
}

class B extends A {
   public static function test()
   {
       echo 'b';
   }
}

A::run(); // output 'aa'
B::run(); // output 'ab'

Tóm tắt lại như sau

  • self: đại diện cho class khai báo nó.
  • static: đại diện cho class gọi đến nó.
Leave A Reply

Your email address will not be published.