__toString và __debugInfo
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 45 trên 91.
Phương thức __toString() cho phép bạn xác định cách một đối tượng được biểu diễn dưới dạng chuỗi. Phương thức này tự động chạy khi bạn dùng một đối tượng trong ngữ cảnh chuỗi, chẳng hạn như với echo hoặc phép nối chuỗi.
<?php
class User {
public function __construct(
private string $name,
private string $email
) {}
public function __toString(): string {
return $this->name . " (" . $this->email . ")";
}
}
$user = new User("Alice", "alice@example.com");
echo $user;
Đầu ra:
Alice (alice@example.com)Phương thức __debugInfo() kiểm soát thông tin xuất hiện khi bạn dùng var_dump() trên một đối tượng. Phương thức này hữu ích khi bạn muốn ẩn dữ liệu nhạy cảm hoặc hiển thị các giá trị được tính toán trong lúc gỡ lỗi:
<?php
class BankAccount {
public function __construct(
private string $accountNumber,
private float $balance,
private string $pin
) {}
public function __debugInfo(): array {
return [
'accountNumber' => '****' . substr($this->accountNumber, -4),
'balance' => $this->balance,
'pin' => '[HIDDEN]'
];
}
}
$account = new BankAccount("1234567890", 1500.00, "9876");
var_dump($account);
Đầu ra:
object(BankAccount)#1 (3) {
["accountNumber"]=>
string(8) "****7890"
["balance"]=>
float(1500)
["pin"]=>
string(8) "[HIDDEN]"
}Hãy chú ý cách __debugInfo() trả về một mảng gồm các cặp khóa và giá trị để thay thế nội dung kết xuất thuộc tính mặc định. PIN nhạy cảm được ẩn đi, còn số tài khoản được che một phần, rất phù hợp để gỡ lỗi an toàn.
Thử thách
DễHãy xây dựng một hệ thống quản lý thông tin đăng nhập để minh họa cả hai phương thức ma thuật __toString() và __debugInfo(). Bạn sẽ tạo một lớp hiển thị thông tin thân thiện với người dùng khi in ra, đồng thời bảo vệ dữ liệu nhạy cảm trong quá trình gỡ lỗi.
Bạn sẽ sắp xếp code trong hai tệp:
Credential.php: Tạo lớpCredentialđể lưu trữ thông tin đăng nhập an toàn. Dùng cú pháp thăng cấp thuộc tính trong hàm khởi tạo để định nghĩa các thuộc tính private cho$username(chuỗi),$password(chuỗi) và$lastLogin(chuỗi). Triển khai hai phương thức ma thuật:__toString(): Trả về một chuỗi thân thiện với người dùng:"User: [username] (Last login: [lastLogin])". Lưu ý rằng mật khẩu không bao giờ xuất hiện trong biểu diễn chuỗi.__debugInfo(): Trả về một mảng chovar_dump(), hiển thị nguyên trạng tên người dùng, che mật khẩu bằng cách chỉ hiển thị"[PROTECTED]"và hiển thị ngày đăng nhập gần nhất như bình thường.
main.php: Nạp tệp Credential. Bạn sẽ nhận ba đầu vào: tên người dùng, mật khẩu và ngày đăng nhập gần nhất. Tạo một đối tượngCredentialvới các giá trị này. Trước tiên, in trực tiếp đối tượng thông tin đăng nhập ra, thao tác này sẽ kích hoạt__toString(). Sau đó, trên dòng mới, dùngvar_dump()với đối tượng để xem đầu ra gỡ lỗi đã được bảo vệ.
Phương thức __toString() cung cấp cách hiển thị thông tin đăng nhập rõ ràng và an toàn mà không để lộ mật khẩu. Phương thức __debugInfo() đảm bảo thông tin nhạy cảm vẫn được ẩn ngay cả khi gỡ lỗi: đây là cách làm rất quan trọng khi xử lý dữ liệu xác thực.
Tự làm thử
<?php
require_once 'Credential.php';
// Đọc các giá trị đầu vào
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: Tạo một instance của Credential với các giá trị đầu vào
// TODO: In đối tượng credential ra (kích hoạt __toString())
// TODO: Dùng var_dump() với đối tượng để xem đầu ra gỡ lỗi của các thuộc tính protected
?>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