魔术方法简介
本课属于 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(),尝试输出对象会导致错误。这个魔术方法会拦截此操作,并返回字符串表示形式。在接下来的课程中,我们会详细学习每个魔术方法。
挑战
简单让我们构建一个电影目录系统,带你了解魔术方法。你将创建一个 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() 方法)
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: PHP 在线编译器