6. TRAITS

Traits dalam PHP adalah mekanisme yang memungkinkan kita untuk menggunakan kembali kode di luar hierarki class. Dengan traits, kita bisa berbagi method antar berbagai class tanpa harus menggunakan pewarisan (inheritance). Hal ini sangat berguna jika beberapa class membutuhkan fungsionalitas yang sama tetapi tidak memiliki hubungan secara langsung.

Sintaks Traits dalam PHP

Untuk mendeklarasikan sebuah trait, kita menggunakan kata kunci trait, diikuti dengan method-method yang ingin digunakan oleh class lain.

trait NamaTrait {
    public function namaMethod() {
        // Implementasi kode
    }
}

Agar suatu class dapat menggunakan trait, kita perlu menyertakan kata kunci use, diikuti dengan nama trait tersebut.

Contoh Implementasi Trait

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
trait Logger {
    public function catatLog($pesan) {
        $className = __CLASS__;
        echo date("Y-m-d H:i:s") . " [{$className}] {$pesan}\n";
    }
}

class Pengguna {
    use Logger;
    
    public $nama;
    
    public function __construct($nama) {
        $this->nama = $nama;
        $this->catatLog("Pengguna '{$this->nama}' telah dibuat.");
    }
}

class KelompokPengguna {
    use Logger;
    
    public $daftarPengguna = [];
    
    public function tambahPengguna(Pengguna $pengguna) {
        $this->daftarPengguna[] = $pengguna;
        $this->catatLog("Pengguna '{$pengguna->nama}' ditambahkan ke kelompok.");
    }
}

// Penggunaan
$kelompok = new KelompokPengguna();
$kelompok->tambahPengguna(new Pengguna("Aldo"));
?>

Pada contoh di atas, trait Logger digunakan oleh class Pengguna dan KelompokPengguna, sehingga kedua class bisa menggunakan method catatLog() tanpa harus menulis ulang kode tersebut. Ini memudahkan pemeliharaan kode dan mendukung reuse logika yang umum digunakan di berbagai class.

Menggunakan Beberapa Traits dalam Satu Class

PHP memungkinkan kita menggunakan lebih dari satu trait dalam satu class dengan memisahkan nama trait menggunakan koma.

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
trait Satu {
    public function aksiSatu() {
        echo "Melakukan aksi pertama.\n";
    }
}

trait Dua {
    public function aksiDua() {
        echo "Melakukan aksi kedua.\n";
    }
}

trait Gabungan {
    use Satu, Dua;
    
    public function semuaAksi() {
        $this->aksiSatu();
        $this->aksiDua();
    }
}

class Kombinasi {
    use Gabungan;
}

$object = new Kombinasi();
$object->semuaAksi();
?>

Dalam contoh ini, trait Gabungan menggunakan Satu dan Dua, sehingga class Kombinasi dapat menggunakan semua method dari kedua trait tersebut. Ini menunjukkan bahwa trait bisa menggunakan trait lain untuk menyusun kembali logika yang modular dan reusable.

Mengatasi Konflik Method pada Traits

Jika dua trait memiliki method dengan nama yang sama, PHP akan menampilkan error. Untuk mengatasinya, kita bisa menggunakan kata kunci insteadof untuk memilih method mana yang akan digunakan.

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
trait Perintah {
    public function jalankan() {
        echo "Menjalankan perintah.\n";
    }
}

trait Lari {
    public function jalankan() {
        echo "Berlari cepat.\n";
    }
}

class Manusia {
    use Perintah, Lari {
        Lari::jalankan insteadof Perintah;
    }
}

$manusia = new Manusia();
$manusia->jalankan();
?>

Dalam contoh ini, Lari::jalankan dipilih sebagai method utama, sehingga method jalankan() dari trait Perintah tidak digunakan. Ini dilakukan dengan menggunakan insteadof untuk menyelesaikan konflik method yang memiliki nama sama pada dua trait.

Menggunakan Alias Method pada Traits

Selain memilih satu method, kita juga bisa memberikan alias pada method trait menggunakan kata kunci as, sehingga kedua method tetap bisa digunakan dalam class yang sama.

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
trait Perintah {
    public function jalankan() {
        echo "Menjalankan perintah.\n";
    }
}

trait Lari {
    public function jalankan() {
        echo "Berlari cepat.\n";
    }
}

class Manusia {
    use Perintah, Lari {
        Perintah::jalankan as jalankanPerintah;
        Lari::jalankan insteadof Perintah;
    }
}

$manusia = new Manusia();
$manusia->jalankan(); 
$manusia->jalankanPerintah(); 
?>

Kode di atas memperlihatkan cara menyelesaikan konflik method yang memiliki nama sama dalam dua trait di PHP, yaitu Perintah dan Lari, yang keduanya memiliki method jalankan(). Pada class Manusia, digunakan use dengan resolusi konflik melalui insteadof untuk menetapkan bahwa method jalankan() dari trait Lari yang akan digunakan, sementara method dari trait Perintah tetap dapat diakses dengan memberikan alias jalankanPerintah menggunakan kata kunci as. Akibatnya, pemanggilan $manusia->jalankan() akan menampilkan "Berlari cepat." dan $manusia->jalankanPerintah() akan menampilkan "Menjalankan perintah.".

LATIHAN

Susunlah potongan kode berikut menjadi program PHP yang benar. Program ini menggunakan trait bernama CetakNama yang berisi method cetak(). Method ini hanya mencetak nama.

Catatan: Terdapat tiga baris dengan kurung kurawal tutup }. Untuk membantumu menyusun, perhatikan komentar di sampingnya yang menunjukkan penutup blok mana (fungsi, trait, atau class).