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-Learning Platform oluşturalım. Bu kapsamlı görev; kalıtım, arayüzler, kapsülleme ve tasarım kalıplarını uyumlu bir sistemde bir araya getirir.
Kodunuzu altı dosyaya ayıracaksınız:
User.php: Hem öğrenciler hem de eğitmenler için temel görevi gören soyut birUsersınıfı oluşturun.id(int) vename(string) için, her ikisi de public readonly olacak şekilde kurucu tanıtımını kullanın. Alt sınıfların uygulaması gereken soyut birgetRole(): stringmetodu ekleyin.Student.php: User dosyasını dahil edin.Studentsınıfını genişleten birUsersınıfı oluşturun. Öğrenciler, kayıt oldukları kursları özel bir dizide ve her kurs için ilerlemelerini (tamamlanma yüzdesini) takip eder. Şunları uygulayın:getRole(): string:"Student"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 dizisini döndürürupdateProgress(string $courseTitle, int $percent): void: Bir kursun ilerlemesini (0-100) ayarlargetProgress(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.Instructorsınıfını genişleten birUsersınıfı oluşturun. Eğitmenler kurs oluşturabilir ve yönetebilir. Şunları uygulayın:getRole(): string:"Instructor"döndürürcreateCourse(string $title, int $capacity): Course: Bu eğitmenin atandığı yeni bir Course oluşturur ve döndürür
Course.php: Instructor dosyasını dahil edin.Course(string, public readonly),title(Instructor, public readonly) veinstructor(int, private) için kurucu tanıtımını kullanan bircapacitysınıfı oluşturun. Kayıtlı öğrencileri özel bir dizide takip edin. Şunları uygulayın:getCapacity(): int: Maksimum kapasiteyi döndürürgetEnrolledCount(): int: Mevcut kayıt sayısını döndürürhasCapacity(): bool: Daha fazla öğrencinin kayıt olabileceği durumda true döndürüraddStudent(Student $student): bool: Kapasite izin veriyorsa öğrenciyi ekler ve başarı durumunu döndürürgetStudents(): array: Kayıtlı öğrenciler 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 dizilerde saklayın. Şunları uygulayın:addCourse(Course $course): void: Bir kursu platforma eklerfindCourse(string $title): ?Course: Bir kursu başlığına göre bulurenrollStudent(Student $student, string $courseTitle): string: Bir öğrenciyi bir 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 verileri (JSON), oluşturulacak kurslar (JSON) ve gerçekleştirilecek işlemler (JSON).Eğitmen JSON biçimi:
{"id": 1, "name": "Dr. Smith"}Kurslar JSON biçimi:
[{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]İşlemler JSON biçimi:
[{"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 işlemi işleyin:"enroll": Yeni bir Student oluşturun ve onu kaydedin;enrollStudent()metodundan gelen sonucu yazdırın"progress": Öğrencinin ilerlemesini güncelleyin;"[name] progress in [course]: [percent]%"yazdırın"stats":getCourseStats()metodundan gelen sonucu yazdırın
Oluşturulan öğrencileri kimliklerine göre takip edin; böylece ilerlemelerini daha sonra güncelleyebilirsiniz. Her işlemin sonucunu yeni bir satıra yazdırın.
Bu görev, 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 davrandığını gösterir.
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ştur
// TODO: instructorData'dan eğitmeni oluştur
// TODO: Eğitmenin createCourse metodunu kullanarak tüm kursları oluştur
// ve bunları platforma ekle
// TODO: Oluşturulan öğrencileri ID'lerine göre takip et
$students = [];
// TODO: Her işlemi işle
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: "enroll" işlemini ele al
// Yeni bir Student oluştur ve kaydet
// enrollStudent() sonucunu yazdır
// TODO: "progress" işlemini ele al
// Öğrenci ilerlemesini güncelle
// Yazdır "[name] progress in [course]: [percent]%"
// TODO: "stats" operasyonunu işle
// getCourseStats() sonucunu yazdır
}
?>Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi