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:
100Truy 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.
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ớpEmployeelàm lớp cơ sở cho tất cả nhân viên. Lớp này cần có thuộc tínhprotected $name(để các lớp con có thể truy cập) và thuộc tínhprivate $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 khaigetName()để trả về tên, phương thức công khaigetSalary()để trả về mức lương và phương thức công khaigiveRaise($amount)để tăng mức lương theo số tiền đã cho.Manager.php: Định nghĩa lớpManagerkế thừaEmployee. 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ằngparent::__construct($name, $salary), sau đó gán phòng ban. Tạo phương thứcgetDetails()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ứcgetDepartment()để trả về phòng ban.main.php: Thêm cả hai tệp lớp. Tạo một đối tượngManagercó tên"Sarah", mức lương75000và phòng ban"Engineering". In thông tin chi tiết của quản lý bằnggetDetails(). Sau đó tăng lương cho quản lý thêm5000và in mức lương mới bằnggetSalary(). 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()
?>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
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa $thisPhương thứcThuộc tínhHàm khởi tạo (__construct)Hàm hủy (__destruct)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnTừ khóa parent::Ghi đè phương thứcTừ khóa finalLớp trừu tượngÔn tập: hệ thống phân cấp nhân viên7Đóng gói
Công khai, được bảo vệ, riêng tưTìm hiểu sâu về bộ điều chỉnh quyền truy cậpGetter và setterẨn thông tinRút gọn hàm khởi tạo (8.0)Ôn tập: hệ thống hồ sơ học sinh2Không gian tên và tự động nạp
Giới thiệu về không gian tênTừ khóa useChuẩn tự động nạp PSR-4Trình tự động nạp của ComposerÔn tập: dự án có tổ chức5Giao diện và hợp đồng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnGiao diện và lớp trừu tượngGợi ý kiểu với giao diệnÔn tập: Máy tính hình học8Phương thức ma thuật
Giới thiệu về phương thức ma thuật__toString và __debugInfo__get, __set, __isset, __unset__call và __callStatic__clone và sao chép đối tượng__serialize và __unserializeÔn tập: Bộ sưu tập tùy chỉnh3Thuộc tính của lớp
Thuộc tính instance và staticHằng số trong lớpPhương thức và thuộc tính staticThuộc tính private và protectedThuộc tính chỉ đọc (PHP 8.1)Ôn tập: Trình quản lý tài khoản ngân hàng6Đa hình
Xem lại việc ghi đè phương thứcĐa hình qua giao diệnGợi ý kiểu và kiểu hợpLiên kết tĩnh muộnÔn tập: bộ xử lý thanh toánTự luyện tập: Trình biên dịch PHP online