Bài 08: Tính đóng gói trong OPP PHP

PHP nâng cao 21/01/2017 10:30 825
Tính đóng gói (encapsulation) "đóng gói" thuộc tính và phương thức của đối tượng (hoặc lớp) thông qua việc giới hạn quyền truy cập (hoặc thay đổi) giá trị của thuộc tính hoặc quyền gọi phương thức. Nói cách khác tính đóng gói cho phép kiểm soát quyền truy cập (và thay đổi) giá trị của thuộc tính hoặc quyền gọi phương thức của đối tượng (hoặc lớp) và đối tượng (hoặc lớp) con.

Trong OPP PHP việc đóng gói được thực hiện nhờ sử dụng các từ khoá publicprivate và protected:

  • public: Cho phép truy cập (và thay đổi giá trị) của thuộc tính và phương thức ở mọi phạm vi
  • private: Chỉ cho phép truy cập (hay thay đổi) giá trị của thuộc tính và phương thức ở phạm vi của đối tượng (hoặc lớp).
  • protected: Chỉ cho phép truy cập (hay thay đổi) giá trị của thuộc tính và phương thức ở phạm vi của đối tượng con (hoặc lớp con).

Để hiểu rõ hơn về tính chất này chúng ta sẽ xem một ví dụ sau.

Ví dụ: Tôi có một đối tượng tên là Person

class Person{
    // Thuộc tính
    public $Name;
    public $Age;
    public $Nickname;
    
    // Hàm khởi tạo
    function __construct(){
        // Lệnh
    }
}
// Khởi tạo đối tượng
$person = new Person();

// Set giá trị cho các thuộc tính
$person->Name = 'Nguyễn Văn A';
$person->Age = 20;
$person->Nickname = 'avannguyen'

Như bạn đã thấy sau khi tôi khởi tạo một đối tượng với tên là $person thì tôi có thể thiết lập cũng như lấy giá trị của các thuộc tính của đối tương Person mà không gặp bất cứ vấn đề gì.

Tôi không muốn cho các các đối tượng khác và cả các lớp con kế thừa từ Person được phép truy cập vào một thuộc tính nào đó trong đối tượng Person giả sử là thuộc tính $Age. Lúc đó tôi sẽ phải sửa lại quyền truy cập của thuộc tính $Age là:

private $Age;

Và khi đó thì chúng ta không thể thiết lập giá trị cho thuộc tính $Age theo cách thông thường như trên nữa. Việc thiết lập giá trị cho biến $Age chỉ được thao tác từ bên trong đối tượng Person thì có một số cách sau:

1. Gán giá trị trong lúc khởi tạo đối tượng.

// Hàm khởi tạo
function __construct($Age){
    // Lệnh
    $this->Age = $Age;
}

2. Xây dựng hàm set giá trị cho thuộc tính.

// Thiết lập giá tri $Age
public function setAge($Age){
    $this->Age = $Age;
}

Và việc lấy giá trị của thuộc tính $Age của đối tượng Person phải thông qua một hàm public function getAge()

// Lấy giá trị
function getAge(){
    return $this->Age;
}

Tổng hợp:

 

class Person{
    // Thuộc tính
    public $Name;
    public $Age;
    public $Nickname;
    
    // Hàm khởi tạo
    function __construct($Age){
        // Lệnh
        $this->Age = $Age;
    }
    // Thiết lập giá tri $Age
    function setAge($Age){
        $this->Age = $Age;
    }
    // Lấy giá trị
    function getAge(){
        return $this->Age;
    }
}
// Khởi tạo đối tượng
$person = new Person(20);
// Set giá trị cho các thuộc tính
$person->Name = 'Nguyễn Văn A';
$person->Nickname = 'avannguyen';
echo $person->Name.'
'; // $person->setAge(20); echo $person->getAge(); // Kết quả: 20;

Ta có thể hiểu nôm la tính đóng gói là không cho bên ngoài biết được bên trong đối tượng có những gì hay được cài đặt như thế nào. Nếu muốn thay đổi bên trong đối tượng thì phải được sự chấp nhận của đối tượng đó thông qua ba mức độ truy cập private protected và public.

 

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.