Menu
Coddy logo textTech

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 message

Anonim 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.

challenge icon

Görev

Kolay

Anonim 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 bir format(string $data): string metoduna sahip FormatterInterface adı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 bir DataProcessor sınıfı oluşturun. Sınıf şunları yapmalıdır:
    • Yapıcısında bir FormatterInterface kabul 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, FormatterInterface arayü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 DataProcessor içine enjekte edin, girdi dizesiyle process() metodunu çağırın ve sonucu yazdırın.

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

?>
quiz iconKendini test et

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