CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
PHP 进阶/课时/OOP 深入
RawBlame
课时目录12 节

PHP 进阶

  1. 01PHP 进阶地图
  2. 02语法与数据结构
  3. 03Web 与超全局变量
  4. 04安全基础
  5. 05OOP 深入
  6. 06现代 PHP 工程
  7. 07数据库与 ORM
  8. 08性能与运维
  9. 09测试与静态分析
  10. 10框架生态
  11. 11集成与 CLI
  12. 12综合练习

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 工程实践。

加载本节练习…
← 上一课
安全基础
下一课 →现代 PHP 工程