Apa itu Traits dalam PHP

Sebenarnya fitur trait ini sudah ada sejak PHP 5.4, jadi bisa dibilang sudah lumayan lama mengingat sekarang versi PHP udah 5.7. Tapi saya sendiri baru memakai dan mencoba mengenalnya lebih dalam lagi sejak mulai mengutak-atik Laravel 5 yang lumayan banyak meng-implementasi trait di dalam codebase mereka. Kemunculan fitur Traits ini dilatarbelakangi oleh masalah dimana sebuah class PHP hanya bisa memiliki 1 inheritance saja. Sedangkan misalnya saja jika 1 class bisa memiliki beberapa inheritance sekaligus tentu bisa mengurangi code duplication dimana bad practice dalam programming. 

Trait itu seperti Mixin yang memberikan kamu kemampuan untuk menggabungkan beberapa Trait class kedalam sebuah class. Nah dalam artikel ini kita akan bahas mengenai apa itu Trait, contoh simple, kelebihan dan kekurangan dari Traits tersebut di dalam projek yang sedang kita kerjakan.

Apa itu Trait?

Trait secara simple adalah kumpulan dari beberapa method yang ingin kamu pakai di dalam class lain. Trait ini tidak bisa di instantiated sendiri, jadi harus di panggil dalam sebuah class seperti contoh di bawah ini.

trait Share{

	public function share($item)
	{

		return 'share this item';

	}

}

Kamu lalu bisa menggunakan trait di atas dalam sebuah class seperti contoh di bawah ini:

Class Post {

	use Share;

}


Class Comment{

	use Share;

}

Jika sekarang kamu membuat sebuah object untuk masing-masing class tersebut maka object ini akan mempunyai method share di dalamnya.

$post = new Post;

echo $post->share(); //return share this item


$comment = new Coment;

echo $coment>share(); //return share this item

Bagaimana cara kerja Trait?

Seperti contoh di atas, kedua object class Post dan Comment masing-masing memiliki method share walaupun tidak punya method share yang didefinisikan langsung di dalam class tersebut.

Cara kerja Trait hanya seperti copy dan paste code selama run time. Yang artinya code Trait Share dicopy ke dalam class Post dan Comment sehingga saat kamu membuat instant baru dari class tersebut maka method share() otomatis ada dalam class tersebut.

Apa beda Trait dengan Abstract Class?

Sebenarnya saya juga ga tau beda pastinya apa, tapi yang jelas Abstract class perlu yang namanya inheritance, sedangkan Trait tidak.

Apa beda Trait dengan Interface?

Trait kelihatannya sama dengan Interface. Keduanya sama-sama simple, ringkas, dan tidak bisa di pakai jika tidak dipanggil di dalam class. Tapi ada perbedaan antara Trait dengan Interface yaitu: Sebuah Interface seperti sebuah kontrak yang menekankan bahwa object ini mampu melakukan fungsi ini dan itu sedangkan sebuah Trait memberikan object tersebut kemampuan untuk melakukan fungsi ini dan itu.

// Interface

interface Sociable {

	public function like();

	public function share();

}

// Trait

trait Sharable {

	public function share($item)
	{

		// share this item

	}
}

// Class

class Post implements Sociable {

	use Sharable;

	public function like()
	{

	//

	}

}

Dalam contoh di atas, interface Sociable menegaskan bahwa postobject mampu melakukan fungsi like() dan share().

Kemudian Shareable traits mengimplementasikan share() dan like() method di Post class.

Jadi seperti yang kamu lihat dicontoh di atas, kita bisa memperkirakan apakah Post object mengimplementasikan Sociable interface. Kemudian Traits mendifinisikan sebuah fungsi yang bisa dipakai berulang-ulang yang bisa kita kombinasikan di dalam class lain yang sama.

$post = new Post; if($post instanceOf Sociable){ $post->share(‘hello world’); }

Apa keuntungan dari traits?

Keuntungannya adalah kamu bisa mengurangi code duplication dan juga mencegah class inheritance yang rumit yang tidak masuk akal dalam konteks aplikasi kamu. Jadi kamu bisa membuat sebuah Traits yang jelas dan ringkas kemudian memanggilnya dalam sebuah class.

Apa kelemahan dari Traits?

Nah penggunaan Traits juga ada beberapa kelemahan seperti yang akan dijelaskan di bawah ini.

Pertama: Traits bisa membuat sebuah class memiliki tugas yang terlalu banyak. Maksudnya dengan kemudahan memasukkan fungsi-fungsi ke dalam sebuah class lewat Trait, maka besar kemungkinan fungsi class tersebut sangat mudah melebar kemana-mana, dimana seharusnya sebuah class hanya memiliki 1 fungsi utama sesuai dengan single responsibility principle.

Kedua: kita tidak bisa melihat semua method yang ada di class tersebut, jadi agak sulit jika terdapat error karena nama method yang sama ataupun logic yang sama dalam sebuah fungsi.

Ketika Traits ini digunakan pada tempat yang tepat, bisa menjadi fitur yang sangat membantu. Tetapi bisa juga jadi alat yang praktis buat programmer males. Contohnya saja, Traits akan dengan mudah untuk memecahkan masalah dalam program yang kamu buat. Jadi tinggal implement trait dalam sebuah class tertentu maka kamu sudah bisa memanggil fungsi tersebut dari object class itu. Simple tapi susah untuk di trek nantinya.

Kesimpulan

Jadi pertanyaan besar adalah apakah kamu harus menggunakan Traits? Saya pikir kamu harus mempertimbangkan menggunakan Traits dalam proyek PHP kamu. Traits memberikan solusi yang bagus untuk ribetnya proses multiple pewarisan yang dapat timbul dalam single inheritance language seperti PHP.

Traits memungkinkan kamu untuk menambahkan fungsi ke dalam sebuah class dengan mudah.

Namun Traits bukanlah jawaban untuk semua masalah kamu. Menggunakan Traits secara tidak pas juga bisa mengarah pada masalah baru yaitu sebuah class memiliki banyak fungsi yang seharusnya tidak dimilikinya. Jadi be wise ya gais.

Please follow and like us:
Tags: PHP

Hi, Saya Agus Yusida

Hello, perkenalkan saya Agus Yusida, seorang freelancer programmer, pernah membuat startup dan suka mencoba hal-hal baru. Jika ada pertanyaan bisa DM saya di IG @yusidajohn untuk fast respond. Jangan lupa like facebook ngide.net ya!

Related Article