Menu
CoddyTech

Giới thiệu về phương thức ma thuật

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 44 trên 91.

Phương thức ma thuật là các phương thức đặc biệt trong PHP bắt đầu bằng hai dấu gạch dưới (__) và được PHP tự động gọi để phản hồi một số sự kiện hoặc hành động nhất định. Bạn đã dùng hai phương thức trong số đó: __construct() và __destruct().

Các phương thức này cho phép bạn can thiệp vào hoạt động nội bộ của PHP và tùy chỉnh cách các đối tượng phản hồi với những thao tác thông thường.

Ví dụ, điều gì xảy ra khi bạn thử in ra một đối tượng? Hoặc truy cập một thuộc tính không tồn tại? Các phương thức ma thuật giúp bạn kiểm soát những tình huống này.

Sau đây là tổng quan nhanh về các phương thức ma thuật được dùng phổ biến nhất:

Phương thứcĐược gọi khi
__construct()Đối tượng được tạo
__destruct()Đối tượng bị hủy
__toString()Đối tượng được dùng làm chuỗi
__get()Truy cập thuộc tính chưa được định nghĩa
__set()Gán giá trị cho thuộc tính chưa được định nghĩa
__call()Gọi phương thức chưa được định nghĩa
__clone()Đối tượng được sao chép
<?php
class Book {
    public function __construct(
        private string $title
    ) {}
    
    public function __toString(): string {
        return "Book: " . $this->title;
    }
}

$book = new Book("PHP Mastery");
echo $book;

Đầu ra:

Book: PHP Mastery

Nếu không có __toString(), việc thử dùng echo với một đối tượng (object) sẽ gây lỗi. Phương thức ma thuật (magic method) chặn thao tác này và trả về biểu diễn dạng chuỗi (string). Trong các bài học tiếp theo, chúng ta sẽ tìm hiểu chi tiết từng phương thức ma thuật.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống danh mục phim để làm quen với các phương thức ma thuật. Bạn sẽ tạo một lớp Movie dùng __construct() để khởi tạo dữ liệu phim và __toString() để tạo biểu diễn chuỗi rõ ràng khi in ra đối tượng.

Bạn sẽ sắp xếp code trong hai tệp:

  • Movie.php: Tạo một lớp Movie đại diện cho các bộ phim trong danh mục. Dùng cách khai báo hàm khởi tạo để xác định các thuộc tính riêng tư cho $title (chuỗi), $director (chuỗi) và $year (số nguyên). Triển khai phương thức ma thuật __toString() để trả về một chuỗi được định dạng: "[title] ([year]) - Directed by [director]". Nhờ vậy, bạn có thể in trực tiếp các đối tượng phim mà không cần gọi một phương thức riêng.
  • main.php: Bao gồm tệp Movie. Bạn sẽ nhận ba đầu vào: tên phim, tên đạo diễn và năm phát hành. Tạo một instance Movie bằng các giá trị này (chuyển năm thành số nguyên). Sau đó, chỉ cần in trực tiếp đối tượng phim: phương thức __toString() sẽ tự động được gọi để tạo đầu ra.

Điểm kỳ diệu của __toString() là PHP tự động gọi phương thức này bất cứ khi nào bạn dùng đối tượng trong ngữ cảnh chuỗi. Thay vì viết echo $movie->getInfo();, bạn chỉ cần viết echo $movie; và PHP sẽ tự chuyển đổi giúp bạn. Nhờ vậy, các đối tượng trở nên trực quan hơn khi sử dụng.

Tự làm thử

<?php

require_once 'Movie.php';

// Đọc đầu vào
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));

// TODO: Tạo một instance của Movie bằng các giá trị đầu vào

// TODO: In trực tiếp đối tượng phim ra màn hình (phương thức __toString() sẽ tự động được gọi)

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