Menu
CoddyTech

__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.

challenge icon

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ớp Credential để 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 cho var_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ượng Credential vớ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ùng var_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

?>
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