Menu
Coddy logo textTech

Birleşim ve Kesişim Tipleri

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 65 / 91.

Boş bırakılabilir (nullable) türler bir türü veya null değerini kabul etmenize olanak tanırken, birleşim türleri (union types) (PHP 8.0+), bir parametrenin veya dönüş değerinin birden fazla farklı türü kabul etmesine olanak tanır. İzin verilen türleri ayırmak için dikey çizgi | karakterini kullanın:

<?php
class Formatter {
    public function format(int|float $number): string {
        return number_format($number, 2);
    }
}

$formatter = new Formatter();
echo $formatter->format(42) . "\n";
echo $formatter->format(3.14159);

Çıktı:

42.00
3.14

Birleşim türleri (Union types), bir metodun farklı ancak ilişkili türlerle çalışabildiği durumlarda özellikle kullanışlıdır. Sınıf adları ve arayüzler de dahil olmak üzere, ihtiyaç duyduğunuz kadar türü birleştirebilirsiniz:

<?php
class Logger {
    public function log(string|array|Stringable $message): void {
        if (is_array($message)) {
            $message = implode(", ", $message);
        }
        echo "Log: $message";
    }
}

Kesişim türleri (PHP 8.1+) bunun tam tersidir; bir değerin belirtilen tüm türleri aynı anda uygulamasını gerektirirler. Bunları birleştirmek için ampersand & işaretini kullanın:

<?php
interface Printable {
    public function print(): string;
}

interface Saveable {
    public function save(): void;
}

class DocumentHandler {
    public function process(Printable&Saveable $doc): void {
        echo $doc->print();
        $doc->save();
    }
}

Burada, process() yalnızca hem Printable hem de Saveable uygulayan nesneleri kabul eder. Bu, metod çalışmadan önce nesnenin gerekli tüm yeteneklere sahip olmasını sağlayarak kodunuzu daha güvenli ve daha ifade edici hale getirir.

challenge icon

Görev

Kolay

Hem birleşim (union) türlerini hem de kesişim (intersection) türlerini gösteren bir veri işlemcisi oluşturalım. Birden fazla girdi formatını işleyebilen ve belirli işlemler için nesnelerin birden fazla arayüzü (interface) uygulamasını gerektiren bir sistem oluşturacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • Interfaces.php — Farklı yetenekleri temsil eden iki arayüz tanımlayın:
    • export(): string metoduna sahip Exportable
    • log(): string metoduna sahip Loggable
  • DataProcessor.php — Hem birleşim hem de kesişim türlerini sergileyen bir DataProcessor sınıfı oluşturun. Interfaces dosyasını dahil edin. Sınıfınız şunlara sahip olmalıdır:
    • Bu türlerden herhangi birini dizeye dönüştüren bir normalize(int|float|string $value): string metodu. Sayılar için onları 2 ondalık basamakla formatlayın. Dizeler için onları olduğu gibi döndürün.
    • Karışık değerlerden (tam sayılar, ondalıklı sayılar veya dizeler) oluşan bir diziyi kabul eden, yukarıdaki metodu kullanarak her birini normalleştiren ve bunları " | " ile birleştirilmiş olarak döndüren bir processMultiple(array $values): string metodu.
    • Her iki arayüzü de uygulayan bir nesne gerektirmek için bir kesişim türü kullanan bir handleDocument(Exportable&Loggable $doc): string metodu. Bu metod, log() çağrısının sonucunu, ardından " -> " ve ardından export() çağrısının sonucunu döndürmelidir.
  • main.php — DataProcessor dosyasını dahil edin. İki girdi alacaksınız: bir tür göstergesi ("int", "float" veya "string") ve bir değer.

    Bir DataProcessor oluşturun ve girdi değerini göstergeye göre uygun türe dönüştürün. Ardından bu değerle normalize() metodunu çağırın ve sonucu yazdırın.

    Ardından, hem Exportable hem de Loggable arayüzlerini uygulayan anonim bir sınıf oluşturun. export() metodu "Exported data" döndürmeli ve log() metodu "Logged" döndürmelidir. Bu nesneyi handleDocument() metoduna geçirin ve sonucu yeni bir satırda yazdırın.

Bu meydan okuma, esnek girdi işleme için birleşim türlerini, nesnelerin birden fazla gerekli yeteneğe sahip olmasını sağlamak için kesişim türleriyle birleştirir; her ikisi de sağlam, tür güvenli PHP uygulamaları oluşturmak için güçlü özelliklerdir.

Kendin dene

<?php

require_once 'DataProcessor.php';

// Girişi oku
$type = trim(fgets(STDIN));
$value = trim(fgets(STDIN));

// TODO: Bir DataProcessor örneği oluşturun


// TODO: $value değerini $type göstergesine göre uygun türe dönüştürün
// ("int", "float" veya "string")


// TODO: Dönüştürülen değerle normalize() metodunu çağırın ve sonucu yazdırın


// TODO: Hem Exportable hem de Loggable arayüzlerini uygulayan anonim bir sınıf oluşturun
// - export() "Exported data" döndürmeli
// - log() "Logged" döndürmeli


// TODO: Anonim sınıf örneğini handleDocument() metoduna geçirin 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