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ız. Anonim sınıflar, nesneleri tam ihtiyaç duyduğunuz yerde, anında oluşturmanıza olanak tanır. Özellikle bağımlılık enjeksiyonu ile birleştirildiklerinde oldukça kullanışlıdırlar.
Anonim bir sınıf, new class ve ardından gelen 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ü hale gelir. Bu, test işlemleri için veya kod tabanınızı tek kullanımlık sınıflarla doldurmadan 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ı (constructor) argümanlarını kabul edebilir. OOP özelliklerine tam erişime sahiptirler; sadece ayrı bir dosya yerine satır içinde tanımlanırlar. Tam bir sınıf tanımının gereksiz olacağı ancak yine de nesne yönelimli davranışa ihtiyaç duyduğunuz durumlarda bunları kullanın.
Görev
KolayAnonim sınıfların gücünü gösteren bir veri formatlayıcı sistemi oluşturalım. Basit, tek seferlik uygulamalar için ayrı sınıf dosyaları oluşturmak yerine, tam ihtiyacınız olan yerde hızlı uygulamalar oluşturmak için anonim sınıfları kullanacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
FormatterInterface.php— Tek birformat(string $data): stringmetoduna sahipFormatterInterfaceadında bir arayüz tanımlayın. Bu, herhangi bir formatlayıcının uyması gereken sözleşmeyi belirler.main.php— Arayüz dosyasını dahil edin ve herhangi bir formatlayıcıyı kabul etmek için bağımlılık enjeksiyonu kullanan birDataProcessorsınıfı oluşturun. Sınıf şunları yapmalıdır:- Yapıcısında bir
FormatterInterfacekabul etmeli - Enjekte edilen formatlayıcıya yetki veren ve sonucunu döndüren bir
process(string $data)metoduna sahip olmalı
İki girdi alacaksınız: bir format türü (
"upper"veya"reverse") ve formatlanacak bir dize.Format türüne bağlı olarak,
FormatterInterfacearayüzünü uygulayan anonim bir sınıf oluşturun:"upper"için:format()metodu veriyi büyük harfe dönüştürülmüş olarak döndürmelidir"reverse"için:format()metodu veriyi ters çevrilmiş olarak döndürmelidir
Anonim sınıfınızı bir
DataProcessoriçine enjekte edin, girdi dizesiyleprocess()metodunu çağırın ve sonucu yazdırın.- Yapıcısında bir
Bu yaklaşım, kod tabanınızı tek kullanımlık sınıf dosyalarıyla doldurmadan 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.
Kopya kağıdı
Anonim sınıflar, tam bir sınıf tanımlamadan anında nesneler oluşturmanıza olanak tanır. new class ve ardından sınıf gövdesi kullanılarak tanımlanırlar:
<?php
$logger = new class {
public function log(string $message): void {
echo "Log: $message";
}
};
$logger->log("Hello!");
Anonim sınıflar arayüzleri (interfaces) uygulayabilir, bu da onları bağımlılık enjeksiyonu (dependency injection) ve test işlemleri için kullanışlı hale getirir:
<?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");
Anonim sınıflar tüm OOP (Nesne Yönelimli Programlama) özelliklerini destekler: diğer sınıfları genişletebilirler, trait'leri kullanabilirler ve yapıcı (constructor) argümanları alabilirler. Tam bir sınıf tanımının gereksiz olduğu ancak yine de nesne yönelimli davranışa ihtiyaç duyduğunuz durumlarda bunları kullanın.
Kendin dene
<?php
require_once 'FormatterInterface.php';
// TODO: Aşağıdakileri yapan bir DataProcessor sınıfı oluşturun:
// - Yapıcısında (constructor) bir FormatterInterface kabul eder
// - Biçimlendiriciye (formatter) delege eden bir process(string $data) metoduna sahiptir
// Girdiyi oku
$formatType = trim(fgets(STDIN));
$inputString = trim(fgets(STDIN));
// TODO: $formatType değerine göre ("upper" veya "reverse"), FormatterInterface
// arayüzünü uygulayan anonim bir sınıf oluşturun
// - "upper" için: format() verinin büyük harf halini döndürmelidir
// - "reverse" için: format() verinin ters çevrilmiş halini döndürmelidir
// TODO: Anonim sınıf biçimlendiricinizle bir DataProcessor oluşturun
// Girdi dizesi ile process() metodunu ç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 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