E-Öğrenme Platformu
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 88 / 91.
Görev
KolayKursları, öğrencileri ve eğitmenleri yöneten bir E-Öğrenme Platformu inşa edelim. Bu kapsamlı meydan okuma; kalıtım (inheritance), arayüzler (interfaces), kapsülleme (encapsulation) ve tasarım desenlerini uyumlu bir sistemde bir araya getiriyor.
Kodunuzu altı dosya halinde düzenleyeceksiniz:
User.php— Hem öğrenciler hem de eğitmenler için temel teşkil eden soyut birUsersınıfı oluşturun. Her ikisi de public readonly olanid(int) vename(string) için constructor promotion kullanın. Alt sınıfların uygulaması gereken soyut birgetRole(): stringmetodu ekleyin.Student.php— User dosyasını dahil edin.Usersınıfını genişleten birStudentsınıfı oluşturun. Öğrenciler, kayıt oldukları kursları özel (private) bir dizide ve her kurs için ilerlemelerini (tamamlanma yüzdesi) takip ederler. Şunları uygulayın:getRole(): string—"Student"değerini döndürürenrollInCourse(Course $course): string— Kursun kapasitesi varsa öğrenciyi kaydeder; başarı veya başarısızlık mesajı döndürürgetEnrolledCourses(): array— Kayıt olunan kursların dizisini döndürürupdateProgress(string $courseTitle, int $percent): void— Bir kurs için ilerlemeyi ayarlar (0-100)getProgress(string $courseTitle): int— İlerleme yüzdesini döndürür, kayıtlı değilse 0 döndürür
Instructor.php— User dosyasını dahil edin.Usersınıfını genişleten birInstructorsınıfı oluşturun. Eğitmenler kurs oluşturabilir ve yönetebilir. Şunları uygulayın:getRole(): string—"Instructor"değerini döndürürcreateCourse(string $title, int $capacity): Course— Bu eğitmenin atandığı yeni bir Course nesnesi oluşturur ve döndürür
Course.php— Instructor dosyasını dahil edin.title(string, public readonly),instructor(Instructor, public readonly) vecapacity(int, private) için constructor promotion kullanan birCoursesınıfı oluşturun. Kayıtlı öğrencileri özel (private) bir dizide takip edin. Şunları uygulayın:getCapacity(): int— Maksimum kapasiteyi döndürürgetEnrolledCount(): int— Mevcut kayıtlı öğrenci sayısını döndürürhasCapacity(): bool— Daha fazla öğrenci kayıt olabiliyorsa true döndürüraddStudent(Student $student): bool— Kapasite uygunsa öğrenciyi ekler, başarı durumunu döndürürgetStudents(): array— Kayıtlı öğrencilerin dizisini döndürür
Platform.php— Course ve Student dosyalarını dahil edin. Tüm sistemi yöneten birPlatformsınıfı oluşturun. Kursları ve kullanıcıları özel (private) dizilerde saklayın. Şunları uygulayın:addCourse(Course $course): void— Platforma bir kurs eklerfindCourse(string $title): ?Course— Başlığa göre bir kurs bulurenrollStudent(Student $student, string $courseTitle): string— Bir öğrenciyi kursa kaydeder."Course not found","Course is full"veya"[name] enrolled in [title]"döndürüngetCourseStats(string $title): string—"[title]: [enrolled]/[capacity] students"veya"Course not found"döndürür
main.php— Platform dosyasını dahil edin. Üç girdi alacaksınız: eğitmen verisi (JSON), oluşturulacak kurslar (JSON) ve gerçekleştirilecek işlemler (JSON).Eğitmen JSON formatı:
{"id": 1, "name": "Dr. Smith"}Kurslar JSON formatı:
[{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]İşlemler JSON formatı:
[{"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"}]Platformu, eğitmeni ve tüm kursları (eğitmenin
createCoursemetodunu kullanarak) oluşturun. Kursları platforma ekleyin. Ardından her bir işlemi işleyin:"enroll"— Yeni bir Student oluşturun ve onu kaydedin;enrollStudent()metodundan gelen sonucu yazdırın"progress"— Öğrenci ilerlemesini güncelleyin;"[name] progress in [course]: [percent]%"yazdırın"stats"—getCourseStats()metodundan gelen sonucu yazdırın
Oluşturulan öğrencileri ID'lerine göre takip edin, böylece ilerlemelerini daha sonra güncelleyebilirsiniz. Her işlemin sonucunu yeni bir satıra yazdırın.
Bu meydan okuma; kalıtımın nasıl temiz bir kullanıcı hiyerarşisi oluşturduğunu, kapsüllemenin kayıt verilerini nasıl koruduğunu ve platformun kurslar, öğrenciler ve eğitmenler arasındaki ilişkileri yöneten bir koordinatör olarak nasıl hareket ettiğini göstermektedir.
Kendin dene
<?php
require_once 'Platform.php';
// Girdileri oku
$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: Platformu oluşturun
// TODO: instructorData'dan eğitmeni oluşturun
// TODO: Eğitmenin createCourse metodunu kullanarak tüm kursları oluşturun
// ve bunları platforma ekleyin
// TODO: Oluşturulan öğrencileri ID'lerine göre takip edin
$students = [];
// TODO: Her bir işlemi işleyin
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: "enroll" işlemini yönetin
// Yeni bir Öğrenci oluşturun ve kaydını yapın
// enrollStudent() metodundan dönen sonucu yazdırın
// TODO: "progress" işlemini yönetin
// Öğrenci ilerlemesini güncelleyin
// "[name] progress in [course]: [percent]%" formatında yazdırın
// TODO: "stats" işlemini yönetin
// getCourseStats() metodundan dönen sonucu yazdırın
}
?>Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi