Araç Kiralama Hizmeti
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 91 / 91.
Görev
KolayAraç Kiralama Hizmeti sistemini oluşturalım; bu sistem bir araç filosunu yönetir, müşteri kiralamalarını takip eder ve araç türüne göre fiyatlandırma yapar. Bu kapsamlı görev, gerçekçi bir kiralama işletmesi uygulaması oluşturmak için kalıtım, arayüzler, kapsülleme ve State desenini bir araya getirir.
Kodunuzu yedi dosyaya ayıracaksınız:
VehicleState.php: Bir aracın bulunabileceği farklı durumları temsil eden birVehicleStatearayüzü tanımlayın. İki yöntem ekleyin:getStatus(): stringvecanRent(): bool. Ardından bu arayüzü uygulayan üç sınıf oluşturun:AvailableState:"Available"vetruedöndürürRentedState:"Rented"vefalsedöndürürMaintenanceState:"Maintenance"vefalsedöndürür
Vehicle.php: Vehicle dosyasını dahil edin.Vehicle(string, public readonly),licensePlate(string, public readonly) vebrand(float, protected) için kurucu destekli, soyut birdailyRatesınıfı oluşturun. Mevcut durumu, varsayılan olarakAvailableStateolacak şekilde özel bir özellikte saklayın. Şunları uygulayın:getState(): VehicleState: mevcut durumu döndürürsetState(VehicleState $state): void: durumu değiştirirgetStatus(): string: durumungetStatus()yöntemine yönlendirircanRent(): bool: durumuncanRent()yöntemine yönlendirirabstract calculateCost(int $days): float: her araç türü farklı şekilde hesaplama yapargetType(): string:static::classkullanarak sınıf adını döndürür
Vehicles.php: Vehicle dosyasını dahil edin. Üç somut araç sınıfı oluşturun:Car: Vehicle sınıfını genişletir;calculateCost(),dailyRate * daysdöndürürMotorcycle: Vehicle sınıfını genişletir;calculateCost(),dailyRate * days * 0.8döndürür (%20 indirim)Van: Ek bir$mileageRate(float) parametresiyle Vehicle sınıfını genişletir;calculateCost(int $days, int $miles = 0),(dailyRate * days) + (mileageRate * miles)döndürür
Customer.php:Customer(int, public readonly) veid(string, public readonly) için kurucu destekli birnamesınıfı oluşturun. Kiralama geçmişini özel bir dizide takip edin. Şunları uygulayın:addRental(string $vehiclePlate, float $cost): void: geçmişe eklergetRentalCount(): int: kiralama sayısını döndürürgetTotalSpent(): float: tüm kiralama maliyetlerinin toplamını döndürür
Rental.php: Vehicle ve Customer dosyalarını dahil edin. Bir müşteriyi bir araca bağlayan birRentalsınıfı oluşturun.customer(Customer, public readonly),vehicle(Vehicle, public readonly),days(int, private) ve isteğe bağlı olarakmiles(int, private, varsayılan değer 0) için kurucu desteğini kullanın. Şunları uygulayın:calculateTotal(): float: araç bir Van isecalculateCost()yöntemine miles değerini gönderir; aksi takdirde yalnızca days değerini gönderircomplete(): string: toplamı hesaplar, müşteri geçmişine ekler, aracı AvailableState durumuna getirir ve"Rental completed: $[total]"döndürür (2 ondalık basamak)
RentalService.php: Rental ve Vehicles dosyalarını dahil edin. Filoyu yöneten birRentalServicesınıfı oluşturun. Araçları license plate ile indekslenmiş özel bir dizide saklayın. Şunları uygulayın:addVehicle(Vehicle $vehicle): void: filoya eklerfindVehicle(string $plate): ?Vehicle: aracı veya null değerini döndürürgetAvailableVehicles(): array:canRent()değeri true olan araçları döndürürrentVehicle(Customer $customer, string $plate, int $days, int $miles = 0): string|Rental: araç bulunamazsa"Vehicle not found"döndürür; kullanılabilir değilse"Vehicle is not available"döndürür; aksi takdirde aracı RentedState durumuna getirir ve yeni bir Rental nesnesi döndürürsetMaintenance(string $plate): string: aracı MaintenanceState durumuna getirir;"[plate] set to maintenance"veya"Vehicle not found"döndürür
main.php: RentalService ve Customer dosyalarını dahil edin. Üç girdi alacaksınız: filo verileri (JSON), müşteri verileri (JSON) ve işlemler (JSON).Filo JSON biçimi:
[{"type": "car", "plate": "CAR-001", "brand": "Toyota", "rate": 50}, {"type": "van", "plate": "VAN-001", "brand": "Ford", "rate": 80, "mileage_rate": 0.25}]Müşteri JSON biçimi:
{"id": 1, "name": "Alice"}İşlemler JSON biçimi:
[{"op": "available"}, {"op": "rent", "plate": "CAR-001", "days": 3}, {"op": "complete", "plate": "CAR-001"}, {"op": "maintenance", "plate": "VAN-001"}, {"op": "customer_stats"}]Kiralama hizmetini oluşturun, tüm araçları filoya ekleyin ve müşteriyi oluşturun. Aktif kiralamaları plate değerine göre takip edin. Her işlemi işleyin:
"available":"Available vehicles: [count]"yazdırın"rent": Aracı kiralayın; başarılı olursa Rental nesnesini saklayın ve"Rented [plate] for [days] days"yazdırın; araç Van ise işlemden miles değerini dahil edin; aksi takdirde hata mesajını yazdırın"complete": O plate değeri için saklanan kiralamayı tamamlayın; sonucu yazdırın"maintenance":setMaintenance()sonucunu yazdırın"status": Verilen plate değeri için"[plate]: [status]"yazdırın"customer_stats":"[name]: [count] rentals, $[total] spent"yazdırın (2 ondalık basamak)
Her sonucu yeni bir satıra yazdırın.
Bu sistem, State deseninin karmaşık koşullu ifadeler olmadan araç kullanılabilirliğini nasıl zarif bir şekilde yönettiğini, kalıtımın polimorfik fiyatlandırmaya sahip temiz bir araç hiyerarşisini nasıl oluşturduğunu ve kapsüllemenin iş akışı boyunca kiralama verilerinin bütünlüğünü nasıl koruduğunu gösterir.
Kendin dene
<?php
require_once 'RentalService.php';
require_once 'Customer.php';
// Girdileri oku
$fleetJson = trim(fgets(STDIN));
$customerJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));
// JSON verilerini ayrıştır
$fleetData = (array)json_decode($fleetJson, true);
$customerData = (array)json_decode($customerJson, true);
$operations = (array)json_decode($operationsJson, true);
// TODO: RentalService örneği oluştur
// TODO: Türe göre tüm araçları filoya ekle:
// - "car" -> new Car(plate, brand, rate)
// - "motorcycle" -> new Motorcycle(plate, brand, rate)
// - "van" -> new Van(plate, brand, rate, mileage_rate)
// TODO: customerData'dan Customer örneği oluştur
// TODO: Aktif kiralamaları plakaya göre takip etmek için dizi oluştur
$activeRentals = [];
// TODO: Her işlemi işle ve sonuçları yazdır:
// - "available": Print "Available vehicles: [count]"
// - "rent": Aracı kirala, başarılıysa Rental'ı sakla, sonucu yazdır
// - "complete": Kiralamayı tamamla, sonucu yazdır
// - "maintenance": Bakım ayarla, sonucu yazdır
// - "status": "[plate]: [status]" yazdır
// - "customer_stats": "[name]: [count] rentals, $[total] spent" yazdır
foreach ($operations as $op) {
$operation = (array)$op;
$opType = $operation['op'];
// TODO: Her işlem türünü işle
switch ($opType) {
case 'available':
// TODO: Print available vehicle count
break;
case 'rent':
// TODO: Aracı kirala ve sonucu yazdır
break;
case 'complete':
// TODO: Kiralamayı tamamla ve sonucu yazdır
break;
case 'maintenance':
// TODO: Bakım ayarla ve sonucu yazdır
break;
case 'status':
// TODO: Araç durumunu yazdır
break;
case 'customer_stats':
// TODO: Müşteri istatistiklerini yazdır
break;
}
}
?>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