Menu
Coddy logo textTech

Eラーニングプラットフォーム

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 88/91。

challenge icon

チャレンジ

簡単

コース、学生、講師を管理するEラーニングプラットフォームを構築しましょう。この包括的なチャレンジでは、継承、インターフェース、カプセル化、およびデザインパターンを1つのまとまりのあるシステムに統合します。

コードは以下の6つのファイルに分けて構成します:

  • User.php — 学生と講師の両方のベースとなる抽象クラス User を作成します。id (int) と name (string) にはコンストラクタのプロパティ昇格(constructor promotion)を使用し、両方を public readonly にします。子クラスが実装しなければならない抽象メソッド getRole(): string を含めてください。
  • Student.php — User ファイルをインクルードします。User を継承した Student クラスを作成します。学生は、登録したコースを private 配列で追跡し、各コースの進捗状況(完了パーセンテージ)も管理します。以下を実装してください:
    • getRole(): string"Student" を返します
    • enrollInCourse(Course $course): string — コースに空きがある場合に学生を登録し、成功または失敗のメッセージを返します
    • getEnrolledCourses(): array — 登録済みコースの配列を返します
    • updateProgress(string $courseTitle, int $percent): void — コースの進捗状況(0-100)を設定します
    • getProgress(string $courseTitle): int — 進捗パーセンテージを返します。登録されていない場合は 0 を返します
  • Instructor.php — User ファイルをインクルードします。User を継承した Instructor クラスを作成します。講師はコースを作成し管理できます。以下を実装してください:
    • getRole(): string"Instructor" を返します
    • createCourse(string $title, int $capacity): Course — この講師が割り当てられた新しい Course を作成して返します
  • Course.php — Instructor ファイルをインクルードします。title (string, public readonly)、instructor (Instructor, public readonly)、および capacity (int, private) をコンストラクタのプロパティ昇格で持つ Course クラスを作成します。登録された学生を private 配列で追跡します。以下を実装してください:
    • getCapacity(): int — 最大定員を返します
    • getEnrolledCount(): int — 現在の登録者数を返します
    • hasCapacity(): bool — さらに学生が登録できる場合は true を返します
    • addStudent(Student $student): bool — 定員に余裕がある場合に学生を追加し、成功ステータスを返します
    • getStudents(): array — 登録されている学生の配列を返します
  • Platform.php — Course と Student ファイルをインクルードします。システム全体を管理する Platform クラスを作成します。コースとユーザーを private 配列に保存します。以下を実装してください:
    • addCourse(Course $course): void — プラットフォームにコースを追加します
    • findCourse(string $title): ?Course — タイトルでコースを検索します
    • enrollStudent(Student $student, string $courseTitle): string — 学生をコースに登録します。"Course not found""Course is full"、または "[name] enrolled in [title]" を返します
    • getCourseStats(string $title): string"[title]: [enrolled]/[capacity] students" または "Course not found" を返します
  • main.php — Platform ファイルをインクルードします。講師データ (JSON)、作成するコース (JSON)、および実行する操作 (JSON) の3つの入力を受け取ります。

    講師の JSON 形式:

    {"id": 1, "name": "Dr. Smith"}

    コースの JSON 形式:

    [{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]

    操作の JSON 形式:

    [{"type": "enroll", "student_id": 1, "student_name": "Alice", "course": "PHP Basics"}, {"type": "progress", "student_id": 1, "course": "PHP Basics", "percent": 50}, {"type": "stats", "course": "PHP Basics"}]

    プラットフォーム、講師、およびすべてのコースを作成します(講師の createCourse メソッドを使用)。コースをプラットフォームに追加します。その後、各操作を処理します:

    • "enroll" — 新しい Student を作成して登録し、enrollStudent() からの結果を出力します
    • "progress" — 学生の進捗を更新し、"[name] progress in [course]: [percent]%" を出力します
    • "stats"getCourseStats() からの結果を出力します

    後で進捗を更新できるように、作成した学生を ID で追跡してください。各操作の結果を新しい行に出力します。

このチャレンジは、継承がいかにクリーンなユーザー階層を作成するか、カプセル化がいかに登録データを保護するか、そしてプラットフォームがコース、学生、講師の間の関係を管理するコーディネーターとしていかに機能するかを示しています。

自分で試してみよう

<?php

require_once 'Platform.php';

// 入力を読み込む
$instructorData = (array)json_decode(trim(fgets(STDIN)), true);
$coursesData = (array)json_decode(trim(fgets(STDIN)), true);
$operations = (array)json_decode(trim(fgets(STDIN)), true);

// TODO: プラットフォームを作成する

// TODO: instructorData から講師を作成する

// TODO: 講師の createCourse メソッドを使用してすべてのコースを作成し、
// プラットフォームに追加する

// TODO: 作成された学生を ID で管理する
$students = [];

// TODO: 各操作を処理する
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: "enroll" 操作を処理する
    // 新しい学生を作成して登録する
    // enrollStudent() の結果を出力する
    
    // TODO: "progress" 操作を処理する
    // 学生の進捗を更新する
    // "[name] progress in [course]: [percent]%" を出力する
    
    // TODO: "stats" 操作を処理する
    // getCourseStats() の結果を出力する
}

?>

オブジェクト指向プログラミングのすべてのレッスン