Ẩn thông tin
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 41 trên 91.
Ẩn thông tin là nguyên tắc nền tảng của tính đóng gói, tức là một lớp chỉ nên cung cấp những gì cần thiết và ẩn các chi tiết triển khai nội bộ. Công cụ để làm việc này là các từ bổ nghĩa quyền truy cập và getter/setter, còn ẩn thông tin là triết lý thiết kế định hướng cách bạn sử dụng chúng.
Mục tiêu là tạo ranh giới rõ ràng giữa việc một lớp thực hiện (giao diện công khai) và cách lớp thực hiện việc đó (cách triển khai nội bộ). Sự tách biệt này cho phép bạn thay đổi cách hoạt động bên trong mà không ảnh hưởng đến code sử dụng lớp đó:
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
Đầu ra:
25C = 77FLớp (class) lưu trữ nhiệt độ nội bộ theo độ Celsius, nhưng người dùng không cần biết điều này. Sau này, bạn có thể đổi cách lưu trữ nội bộ sang Fahrenheit hoặc Kelvin. Miễn là các phương thức công khai vẫn hoạt động như cũ thì không có code bên ngoài nào bị ảnh hưởng.
Điểm chính: Việc ẩn thông tin giúp bảo vệ code khỏi những thay đổi. Hãy ẩn các chi tiết triển khai, chỉ để lộ các giao diện ổn định, nhờ đó bạn sẽ dễ bảo trì và chỉnh sửa các lớp hơn theo thời gian.
Thử thách
DễHãy xây dựng một bộ chuyển đổi tiền tệ để minh họa cách ẩn thông tin trong thực tế. Bạn sẽ tạo một lớp lưu trữ tiền nội bộ bằng một loại tiền tệ, nhưng có thể chuyển đổi liền mạch từ và sang nhiều loại tiền tệ mà không để code bên ngoài biết dữ liệu thực sự được lưu trữ như thế nào.
Bạn sẽ sắp xếp code trong hai tệp:
Money.php: Tạo một lớpMoneylưu trữ nội bộ mọi số tiền dưới dạng xu (số nguyên) để tránh vấn đề về độ chính xác của số dấu phẩy động. Chi tiết triển khai này phải được ẩn hoàn toàn khỏi người dùng lớp. Lớp cần cung cấp:- Một thuộc tính riêng để lưu số tiền tính bằng xu
setDollars(float $amount): nhận số tiền tính bằng đô la và lưu trữ nội bộ dưới dạng xugetDollars(): trả về số tiền tính bằng đô la (số thực, 2 chữ số thập phân)setEuros(float $amount): nhận số tiền tính bằng euro và chuyển đổi sang xu theo tỷ giá: 1 EUR = 1.10 USDgetEuros(): trả về số tiền đã chuyển đổi sang euro (số thực, 2 chữ số thập phân)getInternalValue(): trả về giá trị xu thô (số nguyên) để gỡ lỗi
main.php: Nạp tệp Money. Bạn sẽ nhận hai đầu vào: số tiền tính bằng đô la và số tiền tính bằng euro. Tạo một đối tượngMoney. Trước tiên, đặt số tiền đô la (đã chuyển đổi sang số thực) và in ra ba dòng: giá trị đô la, giá trị euro tương đương và giá trị xu nội bộ. Sau đó, đặt số tiền euro (đã chuyển đổi sang số thực) và in lại ba giá trị tương tự.
Điểm hay của thiết kế này là code bên ngoài làm việc với các giá trị đô la và euro quen thuộc mà hoàn toàn không biết mọi thứ được lưu trữ nội bộ dưới dạng xu. Sau này, bạn có thể đổi cách lưu trữ nội bộ sang một loại tiền tệ cơ sở khác hoặc một chiến lược độ chính xác khác. Chỉ cần các phương thức công khai tiếp tục hoạt động chính xác, code bên ngoài sẽ không cần thay đổi.
Định dạng mọi giá trị đô la và euro với chính xác 2 chữ số thập phân. In mỗi giá trị trên một dòng riêng, tổng cộng sáu dòng đầu ra.
Tự làm thử
<?php
require_once 'Money.php';
// Đọc các giá trị đầu vào
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Tạo một instance của Money
// TODO: Đặt số tiền đô la và in ra:
// Giá trị đô la (2 chữ số thập phân)
// Giá trị euro tương đương (2 chữ số thập phân)
// Giá trị cent nội bộ (số nguyên)
// TODO: Đặt số tiền euro và in ra:
// Giá trị đô la (2 chữ số thập phân)
// Giá trị euro tương đương (2 chữ số thập phân)
// Giá trị cent nội bộ (số nguyên)
?>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