06/04/2021, 14:39

Bài 12: Lớp trừu tượng abstract trong php - Học lập trình PHP nâng cao

1. Lớp trừu tượng abstract Nếu bạn đã từng học qua lập trình hướng đối tượng một ngôn ngữ bất kỳ khác như C++, Java thì abstract khá quen thuộc, và trong php đây cũng là một tính chất của lập trình hướng đối tượng nhưng nó không được xếp vào tính chất quan trọng, tính chất này giống như tính kế ...

1. Lớp trừu tượng abstract

Nếu bạn đã từng học qua lập trình hướng đối tượng một ngôn ngữ bất kỳ khác như C++, Java thì abstract khá quen thuộc, và trong php đây cũng là một tính chất của lập trình hướng đối tượng nhưng nó không được xếp vào tính chất quan trọng, tính chất này giống như tính kế thừa theo tầm nhìn bề ngoài. Lớp Abstract sẽ định nghĩa các hàm (phương thức) mà từ đó các lớp con sẽ kế thừa nó và Overwrite lại (tính đa hình). Tất cả các phương thức của lớp abstract đều phải được khai báo là abstract và phải ở mức protected và public, không được ở mức private. Lớp Abstract có thể có thuộc tính nhưng thuộc tính không được khai báo là abstract, và bạn không thể khởi tạo một biến của lớp Abstract được.

Để khai báo một lớp Abstract ta dùng cú pháp sau:

abstract class BaseClass
{
    // phương thức ở mức protected
    abstract protected function hello();
 
    // Phương thức ở mức public
    abstract public function hi();
}

Trong lớp Abstract các phương thức bạn khai báo ở dạng Abstract đều phải tuân theo cú pháp trên, tức là bạn không được định nghĩa thêm dòng lệnh nào bên trong nó. Như ví dụ dưới này là sai.
abstract class BaseClass
{
    // Phương thức này sai vì hàm hello là
    // hàm abstract nên không được code bên trong nó
    abstract protected function hello()
    {
        // dòng code
        echo 1;
    }
 
}

Như tôi nói ở trên bạn không thể tạo một biến đối tượng mới của lớp Abstract, như ví dụ dưới này là sai:
abstract class BaseClass
{
    abstract protected function hello();
}
 
// Sai vì BaseClass là lớp Abstract nên không
// khởi tạo mới được
$base = new BaseClass();

Mức truy cập các hàm của Abstract phải ở public hoặc protected để lớp kế thừa có thể định nghĩa lại và các thuộc tính của lớp Abstract không được khai báo Abstract. Các bạn xem ví dụ dưới đây:
abstract class BaseClass
{
    // Đúng
    public $name;
 
    // Sai vì các thuộc tính không được để ở dạng abstract
    abstract public $title;
 
    // Đúng
    abstract protected function hello();
 
    // Sai vì hàm abstract không thể ở private
    abstract private function hi_there();
}

Lớp kế thừa từ lớp Abstracth phải Rewrite lại tất cả các hàm Abstract trong lớp Abstract, nếu không sẽ bị báo sai. Ví dụ:
abstract class Person
{
    protected $ten;
    protected $cmnd;
    protected $namsinh;
 
    abstract public function showInfo();
}
 
// Lớp này sai vì chưa viết lại hàm showInfo
class CongNhan extends Person
{
 
}
 
// Lớp này đúng vì ta đã khai báo, viết lại
// đầy đủ các hàm abstract
class SinhVien extends Person
{
    public function showInfo(){
 
    }
}

2. Hàm và lớp final

Lớp Final là lớp được khai báo là lớp cuối cùng, không một lớp nào có thể kế thừa nó. Tương tự như hàm Final trong Abstract hoặc trong kế thừa chỉ để gọi sử dụng, không được viết lại (Override).  Để dễ hình dung các bạn xem ví dụ sau đây và thông qua phần ghi chú tôi đã giải thích.
Ví dụ lớp final:

// Lớp Filnal
final class Person
{
    protected $ten;
    protected $cmnd;
    protected $namsinh;
    public function showInfo()
    {
        echo 'Zaidap.com.net';
    }
}
 
// Hàm này sẽ bị báo lỗi vì lớp SinhVien
// đã kế thừa một lớp Final, điều này là không thể
class SinhVien extends Person {
}
 
// Đoạn code này đúng vì lớp Final được
// sử dụng bình thường như các lớp khác
// chỉ có điều là không được kế thừa
$person = new Person;
$person->showInfo();

Ví dụ hàm final:
class Person
{
    protected $ten;
    protected $cmnd;
    protected $namsinh;
    final public function showInfo()
    {
        echo 'Zaidap.com.net';
    }
}
 
// Lớp này đúng vì lớp Person không phải
// là một lớp final
class SinhVien extends Person {
 
    // Hàm này sai vì hàm showInfo
    // là hàm final trong lớp Person
    // nên không thể Override lại
    public function showInfo(){
 
    }
 
    public function Go()
    {
        // Đoạn code này đúng vì hàm final được
        // sử dụng bình thường
        $this->showInfo();
    }
}

3. Lời kết

Trong bài này chúng ta đã tìm hiểu được thế nào là lớp Abstract (lớp trừu tượng) và từ khóa Final trong php. Qua bài này tôi hy vọng các bạn hiểu được bốn tính chất của lập trình hướng đối tượng mà bất kỳ một ngôn ngữ nào khác đều phải tuân theo quy luật này. Nếu bạn thấy một ngôn ngữ nào mà không có đầy đủ bốn tính chất này thì ngôn ngữ đó không phải là ngôn ngữ có hỗ trợ lập trình hướng đối tượng (như Javascript). Bài tiếp theo chúng ta sẽ tìm hiểu Interface Trong PHP

Trịnh Tiến Mạnh

27 chủ đề

6824 bài viết

Cùng chủ đề
0