Menu
CoddyTech

Thuộc tính private và protected

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 18 trên 91.

Cho đến nay, chúng ta đã dùng các thuộc tính public có thể được truy cập từ bất cứ đâu. Nhưng đôi khi bạn cần hạn chế quyền truy cập để bảo vệ dữ liệu. PHP cung cấp thêm hai phạm vi truy cập: private và protected.

Một thuộc tính (property) private chỉ có thể được truy cập từ bên trong lớp định nghĩa thuộc tính đó:

<?php
class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();

Đầu ra:

100

Truy cập trực tiếp vào $account->balance từ bên ngoài lớp sẽ gây ra lỗi. Điều này giúp bảo vệ số dư, tránh bị thay đổi mà không thông qua phương thức deposit.

Thuộc tính protected hoạt động tương tự, nhưng các lớp con kế thừa từ lớp cha cũng có thể truy cập thuộc tính này:

<?php
class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email;
    }
}

$admin = new Admin("admin@example.com");
echo $admin->showEmail();

Đầu ra:

admin@example.com

Điểm chính: Dùng private khi chỉ lớp khai báo mới nên truy cập thuộc tính. Dùng protected khi các lớp con cũng cần truy cập. Cả hai đều ngăn truy cập trực tiếp từ bên ngoài, giúp bảo vệ trạng thái nội bộ của đối tượng.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống quản lý nhân viên an toàn, thể hiện cách bảo vệ dữ liệu nhạy cảm bằng các thuộc tính private và protected.

Bạn sẽ tạo ba tệp phối hợp với nhau để quản lý thông tin nhân viên bằng cách kiểm soát quyền truy cập phù hợp:

  • Employee.php: Định nghĩa lớp Employee làm lớp cơ sở cho tất cả nhân viên. Lớp này cần có thuộc tính protected $name (để các lớp con có thể truy cập) và thuộc tính private $salary (chỉ lớp này mới được trực tiếp thay đổi mức lương). Hàm khởi tạo nhận tên và mức lương, rồi gán giá trị cho cả hai thuộc tính. Thêm phương thức công khai getName() để trả về tên, phương thức công khai getSalary() để trả về mức lương và phương thức công khai giveRaise($amount) để tăng mức lương theo số tiền đã cho.
  • Manager.php: Định nghĩa lớp Manager kế thừa Employee. Thêm tệp Employee ở đầu tệp. Thêm thuộc tính private $department. Hàm khởi tạo nhận tên, mức lương và phòng ban: gọi hàm khởi tạo của lớp cha bằng parent::__construct($name, $salary), sau đó gán phòng ban. Tạo phương thức getDetails() trả về "[name] manages [department]" bằng cách truy cập trực tiếp thuộc tính protected $name. Đồng thời thêm phương thức getDepartment() để trả về phòng ban.
  • main.php: Thêm cả hai tệp lớp. Tạo một đối tượng Manager có tên "Sarah", mức lương 75000 và phòng ban "Engineering". In thông tin chi tiết của quản lý bằng getDetails(). Sau đó tăng lương cho quản lý thêm 5000 và in mức lương mới bằng getSalary(). Mỗi kết quả cần nằm trên một dòng riêng.

Lưu ý lớp Manager có thể truy cập trực tiếp thuộc tính protected $name, nhưng phải dùng phương thức getSalary() để truy cập mức lương private. Điều này cho thấy khác biệt cốt lõi giữa phạm vi truy cập protected và private: protected cho phép lớp con truy cập, còn private giữ dữ liệu được ẩn hoàn toàn.

Tự làm thử

<?php
require_once 'Employee.php';
require_once 'Manager.php';

// TODO: Tạo một Manager có tên "Sarah", mức lương 75000 và phòng ban "Engineering"

// TODO: In ra thông tin chi tiết của người quản lý bằng getDetails()

// TODO: Tăng lương cho người quản lý thêm 5000

// TODO: In ra mức lương mới bằng getSalary()
?>
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online