Enum'lar (PHP 8.1)
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 59 / 91.
PHP 8.1'den önce, durumlar veya türler gibi sabit bir değer kümesini temsil etmek, sınıf sabitlerini veya sihirli dizeleri kullanmak anlamına geliyordu; her ikisi de hataya açık yaklaşımlardı. Enum'lar (numaralandırmalar), yalnızca belirli, önceden tanımlanmış değerleri barındırabilen bir tür tanımlamak için uygun bir yol sunar.
enum anahtar sözcüğünü kullanarak bir enum tanımlayın:
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name;
Çıktı:
ActiveEnum'lar ayrıca desteklenen değerlere de sahip olabilir - her bir durumla ilişkilendirilmiş dize veya tamsayı değerleri. Bu, enum'ları veritabanlarında veya API'lerde depolarken kullanışlıdır:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value;
Çıktı:
activeDeğer destekli enum'lar, değerinden bir enum oluşturmak için from() yöntemini ve geçersiz değerlerde hata fırlatmak yerine null döndüren tryFrom() yöntemini sağlar:
<?php
$status = Status::from('active'); // Status::Active döndürür
$invalid = Status::tryFrom('unknown'); // null döndürür
Enum'lar ayrıca yöntemler de içerebilir; bu da onları ilgili mantığı kapsüllemek için güçlü hâle getirir. Tür ipuçlarıyla sorunsuz bir şekilde çalışarak işlevlerinizin yalnızca geçerli değerleri kabul etmesini sağlarlar; artık bir dize değerinin beklenen seçeneklerle eşleşip eşleşmediğini sürekli kontrol etmeniz gerekmez.
Görev
KolaySipariş durumlarını tür güvenli bir şekilde temsil etmek için enum'ları kullanan bir sipariş yönetim sistemi oluşturalım. Yanlış yazılabilecek veya geçersiz olabilecek dizelere güvenmek yerine, her durumu veritabanı için uygun bir değere eşleyen, değer destekli bir enum oluşturacaksın.
Kodunu üç dosya arasında düzenleyeceksin:
OrderStatus.php: Dört duruma sahip, dize destekliOrderStatusadlı bir enum oluştur:Pending,'pending'ile desteklenirProcessing,'processing'ile desteklenirShipped,'shipped'ile desteklenirDelivered,'delivered'ile desteklenir
label()metodunu ekle:- Pending,
"Awaiting confirmation"döndürür - Processing,
"Being prepared"döndürür - Shipped,
"On the way"döndürür - Delivered,
"Order complete"döndürür
Order.php: Enum'u kullanan birOrdersınıfı oluştur. OrderStatus dosyasını dahil et. Sınıf:- Yapıcıda, yapıcı terfi özelliğini kullanarak bir sipariş kimliğini (dize) ve bir
OrderStatuskabul etmeli getInfo()döndüren bir"Order [id]: [status label]"metoduna sahip olmalı- Durumun değer destekli değerini döndüren (veritabanında depolama için kullanışlı) bir
getStatusValue()metoduna sahip olmalı
- Yapıcıda, yapıcı terfi özelliğini kullanarak bir sipariş kimliğini (dize) ve bir
main.php: Order dosyasını dahil et. İki girdi alacaksın: bir sipariş kimliği ve bir durum dizesi (örneğin"shipped"). Dize girdisini güvenli bir şekilde birtryFrom()enum'una dönüştürmek içinOrderStatuskullan. Durum geçerliyse birOrderoluştur ve iki satır yazdır:getInfo()sonucunugetStatusValue()sonucunu
"Invalid status"yazdır.
Bu meydan okuma, enum'ların tür güvenliğini nasıl sağladığını gösterir. Order sınıfın yalnızca geçerli durumları kabul edebilir ve tryFrom() metodu, geçersiz değerler riski oluşturmadan kullanıcı girdisini güvenli bir şekilde işlemene olanak tanır.
Kendin dene
<?php
require_once 'Order.php';
// Girişi oku
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));
// TODO: Durum dizesini güvenli bir şekilde bir enum'a dönüştürmek için OrderStatus::tryFrom() kullanın
// tryFrom() değer geçersizse null döndürür
// TODO: Durum geçerliyse, bir Order oluşturun ve yazdırın:
// - getInfo() sonucu
// - getStatusValue() sonucu
// TODO: If the status is invalid, print "Invalid status"
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
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