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 (magic strings) kullanmak anlamına geliyordu; her iki yaklaşım da hataya açıktı. Enums (numaralandırmalar), yalnızca belirli, önceden tanımlanmış değerleri tutabilen bir tür tanımlamak için uygun bir yol sağlar.
enum anahtar kelimesini 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 her bir case ile ilişkilendirilmiş string veya integer değerler olan desteklenen değerlere (backed values) sahip olabilir. Bu, enum'ları veritabanlarında veya API'lerde saklarken kullanışlıdır:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value;
Çıktı:
activeBacked enum'lar, bir değerden enum oluşturmak için bir from() metodu ve geçersiz değerler için hata fırlatmak yerine null döndüren tryFrom() metodunu sunar:
<?php
$status = Status::from('active'); // Status::Active döndürür
$invalid = Status::tryFrom('unknown'); // null döndürür
Enum'lar ayrıca metotlar da içerebilir, bu da onları ilgili mantığı kapsüllemek için güçlü kılar. Tip ipuçlarıyla (type hints) sorunsuz çalışarak fonksiyonlarınızın yalnızca geçerli değerleri kabul etmesini sağlarlar; artık bir dizenin beklenen seçeneklerle eşleşip eşleşmediğini kontrol etmenize gerek kalmaz.
Görev
KolaySipariş durumlarını tip 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ı dostu bir değerle eşleyen bir backed enum oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
OrderStatus.php— Dört durumu olanOrderStatusadında dize tabanlı (string-backed) bir enum oluşturun:'pending'ile desteklenenPending'processing'ile desteklenenProcessing'shipped'ile desteklenenShipped'delivered'ile desteklenenDelivered
label()yöntemi ekleyin:- Pending şunı döndürür:
"Awaiting confirmation" - Processing şunu döndürür:
"Being prepared" - Shipped şunu döndürür:
"On the way" - Delivered şunu döndürür:
"Order complete"
Order.php— Enum'ı kullanan birOrdersınıfı oluşturun. OrderStatus dosyasını dahil edin. Sınıf şunları yapmalıdır:- Constructor promotion kullanarak yapıcı metodunda bir sipariş kimliği (string) ve bir
OrderStatuskabul etmelidir "Order [id]: [status label]"döndüren birgetInfo()yöntemine sahip olmalıdır- Durumun desteklenen değerini (veritabanı depolaması için yararlıdır) döndüren bir
getStatusValue()yöntemine sahip olmalıdır
- Constructor promotion kullanarak yapıcı metodunda bir sipariş kimliği (string) ve bir
main.php— Order dosyasını dahil edin. İki girdi alacaksınız: bir sipariş kimliği ve bir durum dizesi (örneğin"shipped"). Dize girdisini güvenli bir şekilde birOrderStatusenum'ına dönüştürmek içintryFrom()kullanın. Durum geçerliyse, birOrderoluşturun ve iki satır yazdırın:getInfo()yönteminin sonucugetStatusValue()yönteminin sonucu
"Invalid status"yazdırın.
Bu zorluk, enum'ların nasıl tip güvenliği sağladığını gösterir — Order sınıfınız yalnızca geçerli durumları kabul edebilir ve tryFrom() yöntemi, geçersiz değer riski olmadan kullanıcı girdisini güvenli bir şekilde işlemenize olanak tanır.
Kopya kağıdı
Enum'lar, sabit bir değer kümesini tanımlamak için tip güvenli bir yol sağlar. enum anahtar kelimesini kullanarak bir enum tanımlayın:
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name; // Outputs: Active
Destekli enum'lar (Backed enums), her bir durumla dize veya tam sayı değerlerini ilişkilendirir:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value; // Outputs: active
Bir değerden enum oluşturmak için from() metodunu veya geçersiz değerler için null döndüren tryFrom() metodunu kullanın:
<?php
$status = Status::from('active'); // Returns Status::Active
$invalid = Status::tryFrom('unknown'); // Returns null
Enum'lar, ilgili mantığı kapsüllemek için metodlar içerebilir:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
public function label(): string {
return match($this) {
self::Pending => 'Awaiting',
self::Active => 'In Progress',
};
}
}
Kendin dene
<?php
require_once 'Order.php';
// Girdiyi 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 şunları yazdırın:
// - getInfo() sonucu
// - getStatusValue() sonucu
// TODO: Durum geçersizse, "Invalid status" yazdırın
?>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 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