Menu
CoddyTech

魔术方法简介

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 44 课,共 91 课。

魔术方法是 PHP 中以双下划线(__)开头的特殊方法,PHP 会在发生特定事件或操作时自动调用它们。你已经使用过其中两个:__construct() 和 __destruct()。

这些方法可以让你接入 PHP 的内部行为,并自定义对象对常见操作的响应方式。

例如,当你尝试打印一个对象时会发生什么?或者访问一个不存在的属性时呢?魔术方法可以让你控制这些情况。

下面快速介绍最常用的魔术方法:

方法触发时机
__construct()创建对象时
__destruct()销毁对象时
__toString()将对象用作字符串时
__get()访问未定义的属性时
__set()设置未定义的属性时
__call()调用未定义的方法时
__clone()克隆对象时
<?php
class Book {
    public function __construct(
        private string $title
    ) {}
    
    public function __toString(): string {
        return "Book: " . $this->title;
    }
}

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

输出:

Book: PHP Mastery

如果没有 __toString(),尝试输出对象会导致错误。这个魔术方法会拦截此操作,并返回字符串表示形式。在接下来的课程中,我们会详细学习每个魔术方法。

challenge icon

挑战

简单

让我们构建一个电影目录系统,带你了解魔术方法。你将创建一个 Movie 类,使用 __construct() 初始化电影数据,并使用 __toString() 在打印对象时提供简洁的字符串表示形式。

你将把代码分到两个文件中:

  • Movie.php:创建一个 Movie 类,用来表示目录中的电影。使用构造函数属性提升来定义 $title(字符串)、$director(字符串)和 $year(整数)这几个私有属性。实现 __toString() 魔术方法,返回格式化字符串:"[title] ([year]) - Directed by [director]"。这样就可以直接输出电影对象,而不必调用单独的方法。
  • main.php:引入 Movie 文件。你将收到 3 个输入值:电影标题、导演姓名和上映年份。使用这些值创建一个 Movie 实例(将年份转换为整数)。然后直接输出电影对象即可:系统会自动调用 __toString() 方法来生成输出。

__toString() 的妙处在于,当对象被用于字符串上下文时,PHP 会自动调用它。你不必写 echo $movie->getInfo();,只需写 echo $movie;,PHP 就会为你处理转换。这样一来,你就能更直观地使用对象。

亲手试试

<?php

require_once 'Movie.php';

// 读取输入
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));

// TODO:使用输入的值创建一个 Movie 实例

// TODO:直接输出电影对象(会自动调用 __toString() 方法)

?>
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: PHP 在线编译器