Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
  • YardımPHP
  • Traits, Interfaces, and Abstract Classes ne zaman kullanılmalı ?

ChatGPT 4'ün verdiği cevabı aynen ekliyorum:

PHP'de Traits, Interfaces ve Abstract Classes arasındaki farkları anlayabilmek için önce bunların ne işe yaradığına bakalım:

Traits
Traits, birçok sınıf arasında tekrar kullanılabilir metotları kolayca paylaşmak için kullanılır. Trait'ler somut metodlar içerebilir, ancak bunlar durum (property) içeremez.

trait Loggable {
  public function log($message) {
    // Log işlemleri
  }
}

Interfaces
Interfaces, sınıfların uyacakları bir sözleşmeyi tanımlar. Yani bir interface, hangi metodların bir sınıf tarafından uygulanması gerektiğini belirtir, ancak bu metodların nasıl uygulanacağını belirtmez.

interface Loggable {
  public function log($message);
}

Abstract Classes
Abstract sınıflar, temel bir sınıf taslağı oluşturmak için kullanılır. Bir abstract sınıf, somut (concrete) ve soyut (abstract) metodlar içerebilir.

abstract class Loggable {
  public function log($message) {
    // Log işlemleri
  }
  
  abstract public function validate($data);
}

Ne Zaman Kullanılırlar?

Traits: Tekrar kullanılabilir kod parçalarını sınıflar arasında paylaşmak için kullanılır. Örneğin, bir log işlevini farklı sınıflar arasında kullanıyorsanız, bu işlevi bir trait içine alabilir ve bu trait'i kullanmak istediğiniz sınıflarda use anahtar kelimesiyle dahil edebilirsiniz.

Interfaces: Uyulması gereken bir "sözleşme" tanımlamak istediğinizde kullanılır. Bu, farklı sınıfların aynı metodları uygulamasını garanti altına alır.

Abstract Classes: Genel bir işlevselliği (örneğin, ortak metodlar veya property'ler) ve/veya bir sınıfın uygulaması gereken bazı metodları tanımlamak için kullanılır. Eğer bir sınıfın diğer sınıflar tarafından genişletilmesi gerekiyorsa ve bu sınıflar arasında paylaşılacak ortak bir mantık varsa, bir abstract sınıf kullanmak daha iyidir.

Uzman Seviye İpucu

Bir sınıf birden fazla trait ve interface'i aynı anda kullanabilir, ancak sadece bir abstract class'tan türeyebilir. Yani, genellikle çoklu kalıtım ihtiyacı duyarsanız, trait'ler daha uygun olabilir.

Trait'ler, insteadof ve as anahtar kelimeleri ile daha karmaşık senaryoları yönetebilir. Bu sayede metod çakışmalarını çözebilir ve metod isimlerini yeniden adlandırabilirsiniz.

Abstract sınıflar ve interface'ler arasındaki en büyük fark, abstract sınıfların durum (property) ve somut metodlar içerebilmesidir. Interface'ler sadece metod imzalarını içerir.

Bu bilgiler ışığında, hangi yapıyı ne zaman kullanacağınıza karar vermek için projenizin ihtiyaçlarını göz önünde bulundurmalısınız.

    sineld teşekkür ederim hocam.
    Uzman Seviye İpucu başlığını siz mi sordunuz yoksa kendisi mi ekledi

      aghabalaguluzade İnşaatta çimento, demir, alçı nerede kullanılır gibi bir soru ile gelmişsiniz 🙂 Önce PHP dokümanlarını inceleyin, temel olarak ne olduklarını öğrenin, zaten sorunuz da cevaplanmış olur:

      https://www.php.net/manual/en/language.oop5.php
      https://www.php.net/manual/en/language.oop5.traits.php
      https://www.php.net/manual/en/language.oop5.interfaces.php
      https://www.php.net/manual/en/language.oop5.abstract.php

      Ondan sonra kafanıza takılanları burada sorun çünkü dokümanları buraya taşımanın bir anlamı yok. Soru da zaten kitap gibi cevap istiyor...

      Bir de interface ile alaklı şöyle bir yazım vardı:
      https://medium.com/clevelteam/laravel-de-yard%C4%B1mc%C4%B1-nesne-aray%C3%BCzleri-interface-9ce2ad67e4c0