OOP 深入
多态、抽象类、Trait、魔术方法。
35 分钟
OOP 深入
php-essentials 已介绍类与继承;本课深入 多态、抽象类、Trait 与魔术方法。路径 /roadmaps/php。
学习目标
- 用接口与抽象类实现多态
- 用 Trait 复用横切行为
- 理解常用魔术方法的适用场景
多态与抽象类
<?php
declare(strict_types=1);
interface LessonRepository {
public function findBySlug(string $slug): ?array;
}
abstract class BaseRepository implements LessonRepository {
public function __construct(protected PDO $pdo) {}
}
class PdoLessonRepository extends BaseRepository {
public function findBySlug(string $slug): ?array {
$stmt = $this->pdo->prepare('SELECT * FROM lessons WHERE slug = ?');
$stmt->execute([$slug]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row ?: null;
}
}
调用方依赖 LessonRepository 接口,便于测试时替换为内存实现。
Trait
trait Timestampable {
public function touch(): void {
$this->updatedAt = new DateTimeImmutable();
}
}
class Lesson {
use Timestampable;
public function __construct(
public string $slug,
public DateTimeImmutable $updatedAt = new DateTimeImmutable(),
) {}
}
Trait 解决单继承局限;避免 Trait 之间方法名冲突。
魔术方法
class Track {
public function __construct(private array $lessons) {}
public function __get(string $name): mixed {
return $this->lessons[$name] ?? null;
}
public function __toString(): string {
return 'Track(' . count($this->lessons) . ' lessons)';
}
}
练习
- 定义
CacheRepository装饰器,包装LessonRepository加内存缓存 - 用 Trait 给模型加
toArray()方法
小结
接口定契约、抽象类共享逻辑、Trait 横向复用。 下一课讲现代 PHP 工程实践。
加载本节练习…