E-러닝 플랫폼
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 88번째.
챌린지
쉬움강좌, 학생, 강사를 관리하는 E-러닝 플랫폼을 구축해 봅시다. 이 종합적인 챌린지는 상속, 인터페이스, 캡슐화 및 디자인 패턴을 하나의 응집력 있는 시스템으로 결합합니다.
코드는 다음 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)의 세 가지 입력을 받습니다.강사 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를 사용하여 강사(instructor) 생성
// TODO: 강사의 createCourse 메서드를 사용하여 모든 강의를 생성하고
// 플랫폼에 추가
// TODO: 생성된 학생들을 ID별로 추적
$students = [];
// TODO: 각 작업(operation) 처리
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: "enroll" 작업 처리
// 새로운 학생(Student)을 생성하고 등록
// enrollStudent()의 결과 출력
// TODO: "progress" 작업 처리
// 학생 진도 업데이트
// "[name] progress in [course]: [percent]%" 출력
// TODO: "stats" 작업 처리
// getCourseStats()의 결과 출력
}
?>객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션