Bài 12: Lớp trừu tượng abstract trong php OPP

PHP nâng cao 21/01/2017 10:39 1537
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.

1.Abstract Class là gì ?

Lớp trừu tượng trước tiên nó chính là 1 lớp, nhưng nó được gọi là lớp trừu tượng bởi vì:

  • Lớp này sẽ chứa các phương thức trừa tượng.
  • Các lớp khác khi kế thừa lớp trừu tượng sẽ phải định nghĩa các phương thức trừu tượng ấy.
  • Một class chỉ có thể kế thừa 1 lớp trừu tượng.

Cú pháp để khai báo 1 abstract class:

abstract class Database{
     abstract protected function checkExistUser();
     abstract protected function updateUser();
}

Một số lưu ý khi sử dụng Abstract class.

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

abstract class Database{
     abstract protected function checkExistUser(){
         /*
         * Dùng thế này là sai bởi:
         * function checkExistUser là abstract function nên không code trong đó
         */
         echo 'check exist user';
     }
}

Bạn không thể tạo một biến đối tượng mới của lớp Abstract.

abstract class Database{
     abstract protected function checkExistUser();
}
/*
* Khởi tạo đối tượng từ một Abstract class là sai
*/
$db = new Database();

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.

abstract class Database{
    public $table; // Đúng
    abstract public $rules; //Sai, vì thuộc tính không thể để dạng Abstract
    
    abstract protected function checkExistUser(); //Đúng 
    abstract private function updateUser(); //Sai, Abstract function không thể private
}

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

abstract class Database{
     public $table;
     abstract protected function checkExistUser();
}

class User extends Database{
    protected function checkExistUser() {
        //Tất cả các lớp kế thừa từ Abstract class đều phải định nghĩa lại các method của Abstract Class
    }
}

2. Vai trò của Abstract Class trong OPP

Đó là, trong lập trình, khi bạn (hoặc một người nào đó) xây dựng một hệ thống website, và trong quá trình xây dựng (code) lên hệ thống ấy, bạn muốn ép buộc người lập trình phải tuân thủ theo một số các phương thức và các phương thức này đã được định nghĩa sẵn những thứ cơ bản, để giúp cho lập trình viên có thể kế thừa các phương thức này và phát triển lớp con của họ.

3. Ví dụ

Sau đây mình xin giới thiệu các bạn một Abstract class và 1 class extends từ Abstract class cho các bạn dễ hiểu

abstract class Person{
    private $givenName;
    private $familyName;
    
    public function setGivenName($gn) {
        $this->givenName = $gn;
    }
    
    public function getGivenName(){
        return $this->givenName;
    }
    
    public function setFamilyName($fn){
        $this->familyName = $fn;
    }
    
    public function getFamilyName(){
        return $this->familyName;
    }
     
    public function sayHello() {
        echo("Hello, I am ");
        $this->introduceSelf();
    }
    
    abstract public function introduceSelf();
    
}

class Employee extends Person{
    private $role;
    
    public function setRole($r) {
        $this->role = $r; 
    }
    
    public function getRole(){
        return $this->role;
    }
    
    public function introduceSelf(){
        echo($this->getRole() . " " . $this->getGivenName() . " " . $this->getFamilyName());
    }
}

4. Tổng 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). 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.

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.