Menu
CoddyTech

Pengantar Trait

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 51 dari 91.

PHP hanya mendukung pewarisan tunggal, sebuah class hanya dapat mewarisi satu class induk. Namun, bagaimana jika kamu perlu berbagi fungsionalitas di beberapa class yang tidak saling berkaitan? Di sinilah trait berperan.

Trait adalah mekanisme untuk menggunakan ulang kode yang memungkinkan kamu mendefinisikan method dan property yang dapat disisipkan ke dalam beberapa class. Anggap trait sebagai salin-tempel pada tingkat bahasa, kode dari trait menjadi bagian dari class yang menggunakannya.

<?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();

Kata kunci use di dalam class mengimpor anggota trait. Sekarang Article dapat mengakses setCreatedAt() dan getCreatedAt() seolah-olah keduanya didefinisikan langsung di dalam class.

Trait yang sama dapat digunakan di class yang sama sekali tidak terkait, seperti class Comment, class User, atau class lain yang memerlukan fungsi timestamp. Ini mengatasi keterbatasan pewarisan tunggal dengan memungkinkan berbagi kode secara horizontal di seluruh hierarki class kamu.

challenge icon

Tantangan

Mudah

Mari kita buat sistem sapaan sederhana yang menunjukkan cara trait memungkinkan kamu berbagi fungsionalitas di antara class yang tidak berkaitan. Kamu akan membuat trait yang menyediakan kemampuan untuk memberi sapaan, lalu menggunakannya di dua class yang sama sekali berbeda.

Kamu akan mengatur kodemu dalam tiga file:

  • Greetable.php: Buat trait bernama Greetable yang menyediakan fungsionalitas sapaan. Trait ini harus memiliki:
    • Property privat $greeting (string)
    • Method setGreeting(string $greeting) yang menyimpan pesan sapaan
    • Method greet() yang mengembalikan pesan sapaan
  • Person.php: Buat class Person yang menggunakan trait Greetable. Sertakan file trait dan gunakan promosi constructor untuk mendefinisikan property publik $name. Di dalam constructor, panggil setGreeting() untuk menetapkan sapaan menjadi "Hello, I'm [name]".
  • Robot.php: Buat class Robot yang juga menggunakan trait Greetable. Sertakan file trait dan gunakan promosi constructor untuk mendefinisikan property publik $model. Di dalam constructor, panggil setGreeting() untuk menetapkan sapaan menjadi "Beep boop, I am model [model]".

Di main.php, sertakan kedua file class. Kamu akan menerima dua input: nama seseorang dan nomor model robot. Buat instance dari kedua class dan cetak sapaan masing-masing pada baris terpisah.

Ini menunjukkan kekuatan trait: Person dan Robot adalah class yang sama sekali tidak berkaitan dan tidak memiliki parent yang sama, tetapi keduanya memperoleh fungsionalitas sapaan yang sama melalui trait. Setiap class menyesuaikan cara menggunakan fungsionalitas tersebut dengan caranya sendiri.

Coba sendiri

<?php

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

// Baca input
$name = trim(fgets(STDIN));
$model = trim(fgets(STDIN));

// TODO: Buat instance Person dengan nama yang diberikan
// TODO: Buat instance Robot dengan model yang diberikan
// TODO: Tampilkan salam dari Person
// TODO: Tampilkan salam dari Robot (di baris baru)

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online