Menu
Coddy logo textTech

Trait'lere Giriş

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

PHP yalnızca tekli kalıtımı destekler - bir sınıf yalnızca bir ebeveyn sınıfı genişletebilir. Peki ya ilgisiz birden fazla sınıf arasında işlevsellik paylaşmanız gerekirse? İşte burada trait'ler devreye girer.

Trait, birden fazla sınıfa eklenebilen metotlar ve özellikler tanımlamanıza olanak tanıyan, kodun yeniden kullanımı için bir mekanizmadır. Trait'leri dil düzeyinde kopyala-yapıştır olarak düşünün; bir trait'teki kod, onu kullanan sınıfın bir parçası haline gelir.

<?php
trait Timestampable {
    private string $createdAt;
    
    public function setCreatedAt(): void {
        $this->createdAt = date('Y-m-d H:i:s');
    }
    
    public function getCreatedAt(): string {
        return $this->createdAt;
    }
}

class Article {
    use Timestampable;
    
    public function __construct(public string $title) {
        $this->setCreatedAt();
    }
}

$article = new Article("PHP Traits");
echo $article->getCreatedAt();

Bir sınıf içindeki use anahtar kelimesi, trait'in üyelerini içe aktarır. Artık Article, setCreatedAt() ve getCreatedAt() metotlarına sanki doğrudan sınıf içinde tanımlanmışlar gibi erişebilir.

Aynı trait, tamamen alakasız sınıflarda kullanılabilir - bir Comment sınıfı, bir User sınıfı veya zaman damgası işlevselliğine ihtiyaç duyan başka herhangi bir sınıf. Bu, sınıf hiyerarşiniz boyunca yatay kod paylaşımına izin vererek tekli kalıtımın sınırlamasını çözer.

challenge icon

Görev

Kolay

İlişkisiz sınıflar arasında işlevselliği paylaşmanıza olanak tanıyan trait'lerin nasıl çalıştığını gösteren basit bir selamlama sistemi oluşturalım. Selamlama yeteneği sağlayan bir trait oluşturacak ve ardından bunu tamamen farklı iki sınıfta kullanacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • Greetable.php — Selamlama işlevselliği sağlayan Greetable adında bir trait oluşturun. Trait şunlara sahip olmalıdır:
    • Özel bir $greeting özelliği (string)
    • Selamlama mesajını saklayan bir setGreeting(string $greeting) metodu
    • Selamlama mesajını döndüren bir greet() metodu
  • Person.phpGreetable trait'ini kullanan bir Person sınıfı oluşturun. Trait dosyasını dahil edin ve genel bir $name özelliği tanımlamak için constructor promotion kullanın. Yapıcı metodun içinde, selamlamayı "Hello, I'm [name]" olarak ayarlamak için setGreeting() metodunu çağırın.
  • Robot.php — Yine Greetable trait'ini kullanan bir Robot sınıfı oluşturun. Trait dosyasını dahil edin ve genel bir $model özelliği tanımlamak için constructor promotion kullanın. Yapıcı metodun içinde, selamlamayı "Beep boop, I am model [model]" olarak ayarlamak için setGreeting() metodunu çağırın.

main.php dosyasında her iki sınıf dosyasını da dahil edin. İki girdi alacaksınız: bir kişinin adı ve bir robotun model numarası. Her iki sınıftan da örnekler oluşturun ve selamlamalarını ayrı satırlara yazdırın.

Bu, trait'lerin gücünü gösterir — Person ve Robot ortak bir üst sınıfa sahip olmayan tamamen alakasız sınıflardır, ancak her ikisi de trait aracılığıyla aynı selamlama işlevselliğini kazanır. Her sınıf, bu işlevselliği kendi yöntemiyle nasıl kullanacağını özelleştirir.

Kopya kağıdı

Bir trait, PHP'nin tekli kalıtım sınırlamasını çözerek, metotları ve özellikleri ilişkisiz birden fazla sınıf arasında paylaşmanıza olanak tanıyan bir kod yeniden kullanım mekanizmasıdır.

trait anahtar kelimesini kullanarak bir trait tanımlayın:

<?php
trait Timestampable {
    private string $createdAt;
    
    public function setCreatedAt(): void {
        $this->createdAt = date('Y-m-d H:i:s');
    }
    
    public function getCreatedAt(): string {
        return $this->createdAt;
    }
}

Bir sınıfta use anahtar kelimesiyle bir trait kullanın:

class Article {
    use Timestampable;
    
    public function __construct(public string $title) {
        $this->setCreatedAt();
    }
}

Trait'in metotları ve özellikleri, sanki doğrudan sınıfın içinde tanımlanmış gibi sınıfın bir parçası haline gelir. İlişkisiz birden fazla sınıf, işlevselliği sınıf hiyerarşiniz boyunca yatay olarak paylaşmak için aynı trait'i kullanabilir.

Kendin dene

<?php

require_once 'Person.php';
require_once 'Robot.php';

// Girdiyi oku
$name = trim(fgets(STDIN));
$model = trim(fgets(STDIN));

// TODO: Verilen isimle bir Person örneği oluşturun
// TODO: Verilen modelle bir Robot örneği oluşturun
// TODO: Person'ın selamlamasını yazdırın
// TODO: Robot'un selamlamasını yazdırın (yeni bir satırda)

?>
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