Anonim Sınıflar
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 58 / 91.
Bazen tam bir sınıf tanımlamanın getirdiği ek yük olmadan basit, tek seferlik bir nesneye ihtiyaç duyarsın. Anonim sınıflar, nesneleri tam ihtiyaç duyduğun yerde anında oluşturmanı sağlar. Özellikle bağımlılık enjeksiyonuyla birleştirildiklerinde oldukça kullanışlıdır.
Anonim bir sınıf, new class ifadesinin ardından sınıf gövdesi kullanılarak tanımlanır:
<?php
$logger = new class {
public function log(string $message): void {
echo "Log: $message";
}
};
$logger->log("Hello!");
Çıktı:
Log: Hello!Anonim sınıflar, arayüzleri uygularken güçlü hâle gelir. Bu, test yapmak için veya kod tabanınızı yalnızca bir kez kullanılan sınıflarla karmaşıklaştırmadan hızlı bir uygulamaya ihtiyaç duyduğunuzda mükemmeldir:
<?php
interface Notifier {
public function send(string $message): string;
}
function notify(Notifier $notifier, string $msg): string {
return $notifier->send($msg);
}
$result = notify(new class implements Notifier {
public function send(string $message): string {
return "Sent: $message";
}
}, "Test message");
echo $result;
Çıktı:
Sent: Test messageAnonim sınıflar ayrıca diğer sınıfları genişletebilir, trait’leri kullanabilir ve yapıcı bağımsız değişkenlerini kabul edebilir. OOP özelliklerine tam erişimleri vardır; yalnızca ayrı bir dosyada değil, satır içinde tanımlanırlar. Tam bir sınıf tanımı gereğinden fazla olduğunda, ancak yine de nesne yönelimli davranışa ihtiyaç duyduğunuzda bunları kullanın.
Görev
KolayAnonim sınıfların gücünü gösteren bir veri biçimlendirici sistemi oluşturalım. Basit, tek seferlik uygulamalar için ayrı sınıf dosyaları oluşturmak yerine, ihtiyaç duyduğunuz yerde hızlı uygulamalar oluşturmak için anonim sınıfları kullanacaksınız.
Kodunuzu iki dosyada düzenleyeceksiniz:
FormatterInterface.php:FormatterInterfaceadlı bir arayüzü, tek birformat(string $data): stringmetoduyla tanımlayın. Bu, herhangi bir biçimlendiricinin uyması gereken sözleşmeyi belirler.main.php: Arayüz dosyasını dahil edin ve herhangi bir biçimlendiriciyi bağımlılık enjeksiyonu kullanarak kabul eden birDataProcessorsınıfı oluşturun. Sınıf şunları yapmalıdır:- Kurucusunda bir
FormatterInterfacekabul etmek - Enjekte edilen biçimlendiriciye delege eden ve sonucunu döndüren
process(string $data)metoduna sahip olmak
İki girdi alacaksınız: bir biçim türü (
"upper"veya"reverse") ve biçimlendirilecek bir dize.Biçim türüne göre,
FormatterInterfacearayüzünü uygulayan anonim bir sınıf oluşturun:"upper"için:format()metodu, verileri büyük harfe dönüştürülmüş şekilde döndürmelidir"reverse"için:format()metodu, verileri ters çevrilmiş şekilde döndürmelidir
Anonim sınıfınızı bir
DataProcessoriçine enjekte edin, giriş dizesiyleprocess()metodunu çağırın ve sonucu yazdırın.- Kurucusunda bir
Bu yaklaşım, kod tabanınızı tek kullanımlık sınıf dosyalarıyla karmaşıklaştırmadan hızlı bir uygulamaya ihtiyaç duyduğunuzda mükemmeldir. Anonim sınıf satır içinde oluşturulur, gerekli arayüzü uygular ve bu arayüzün beklendiği her yere aktarılabilir.
Kendin dene
<?php
require_once 'FormatterInterface.php';
// TODO: Bir DataProcessor sınıfı oluşturun ki:
// - Kurucusunda bir FormatterInterface kabul eder
// - Biçimlendiriciye devreden bir process(string $data) metoduna sahiptir
// Girdiyi oku
$formatType = trim(fgets(STDIN));
$inputString = trim(fgets(STDIN));
// TODO: Based on $formatType ("upper" or "reverse"), create an anonymous class
// FormatterInterface'i uygulayan
// - "upper" için: format() verinin büyük harf versiyonunu döndürmelidir
// - "reverse" için: format() verinin ters çevrilmiş versiyonunu döndürmelidir
// TODO: Create a DataProcessor with your anonymous class formatter
// Girdi dizesiyle process() çağırın ve sonucu 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 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