Menu
Coddy logo textTech

Trait Çakışmalarını Çözümleme

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

İki trait aynı ada sahip yöntemler tanımladığında PHP kritik bir hata verir. insteadof ve as operatörlerini kullanarak PHP’ye bu çakışmayı nasıl ele alacağını açıkça belirtmelisin.

<?php
trait FileLogger {
    public function log(string $message): void {
        echo "File: $message";
    }
}

trait DatabaseLogger {
    public function log(string $message): void {
        echo "DB: $message";
    }
}

class Application {
    use FileLogger, DatabaseLogger {
        FileLogger::log insteadof DatabaseLogger;
        DatabaseLogger::log as logToDatabase;
    }
}

$app = new Application();
$app->log("Error occurred");
$app->logToDatabase("Error occurred");

Çıktı:

File: Error occurred
DB: Error occurred

insteadof operatörü, bir çakışma olduğunda hangi trait’in yönteminin kullanılacağını seçer. Bu örnekte FileLogger::log kazanır ve varsayılan log() yöntemi olur. as operatörü bir takma ad oluşturur ve diğer trait’in yöntemine farklı bir ad altında erişmenizi sağlar.

Bir yöntemin görünürlüğünü değiştirmek için as ifadesini de kullanabilirsin:

<?php
trait Greeting {
    public function sayHello(): void {
        echo "Hello!";
    }
}

class Person {
    use Greeting {
        sayHello as private;
    }
}

Bu, trait içinde public olsa bile sayHello() yöntemini Person sınıfı içinde private yapar. Çakışma çözümleme, trait yöntemlerinin sınıflarınıza nasıl entegre edileceği üzerinde ayrıntılı denetim sağlar.

challenge icon

Görev

Kolay

Farklı kanalların mesaj gönderebildiği bir bildirim sistemi oluşturalım; ancak birden fazla trait aynı yöntem adını sağladığında çakışmaları çözmemiz gerekiyor.

Kodunuzu dört dosyaya ayıracaksınız:

  • EmailNotifier.php: EmailNotifier adlı bir trait oluşturun ve "Email: [message]" döndüren notify(string $message) yöntemini ekleyin.
  • SmsNotifier.php: SmsNotifier adlı bir trait oluşturun ve "SMS: [message]" döndüren notify(string $message) yöntemini ekleyin.
  • AlertService.php: Her iki trait'i de kullanan bir AlertService sınıfı oluşturun. Her iki trait de bir notify() yöntemine sahip olduğundan bu çakışmayı çözmeniz gerekir:
    • Varsayılan notify() yöntemi olarak EmailNotifier::notify kullanın
    • SmsNotifier::notify yöntemi için notifyBySms adında bir takma ad oluşturun
    Ayrıca her iki bildirim yöntemini çağıran ve bunları ayrı satırlarda birleştirilmiş olarak döndüren notifyAll(string $message) yöntemini ekleyin.
  • main.php: Gerekli tüm dosyaları dahil edin ve bir AlertService örneği oluşturun. Bir girdi alacaksınız: bir mesaj dizesi. Üç satır yazdırın:
    • Mesajla birlikte notify() çağrısının sonucu
    • Mesajla birlikte notifyBySms() çağrısının sonucu
    • Mesajla birlikte notifyAll() çağrısının sonucu

Bu örnek, adlandırma çakışması olduğunda hangi trait yönteminin öncelikli olacağını insteadof kullanarak belirlemeyi, as kullanarak ise diğer trait'in yöntemine farklı bir ad altında erişmeye devam etmeyi gösterir.

Kendin dene

<?php
require_once 'AlertService.php';

// Girdiyi oku
$message = trim(fgets(STDIN));

// TODO: Bir AlertService örneği oluştur

// TODO: mesaj ile notify() çağrısının sonucunu yazdır

// TODO: mesaj ile notifyBySms() çağrısının sonucunu yazdır

// TODO: mesaj ile notifyAll() çağrısının sonucunu yazdır
?>
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

Kendi başına pratik yap: Online PHP derleyicisi