Ahmad Ma'ruf

Catatan Tentang PHP: Trait, Interface, dan Class Composition

Hari ini saya belajar tentang beberapa fitur PHP yang tidak pernah saya pikirkan sebelumnya.
Berkat Laravel, semuanya sudah tersedia, sehingga saya tak pernah memikirkan PHP lebih mendalam sebagai sebuah programming language.

1. Interface

Sama seperti di bahasa lain, interface ini umumnya digunakan sebagai contract agreement tentang suatu class yang memungkinkan memiliki berbagai implementasi. Misalnya interface UserRepository, yang bisa saja diimplementasikan menggunakan MySQL maupun PostgreSQL
Hal ini memungkinkan method signature keduanya tetap sama, sehingga “consumer” dari interface tersebut tidak perlu melakukan penyesuaian apabila implementasinya berubah.

Contoh:

 1interface UserRepository
 2{
 3    public function set($params): string;
 4    public function get(): string;
 5}
 6
 7class MysqlUserRepository implements UserRepository
 8{
 9    public function set($params): string
10    {
11        // implementasi dengan MySQL
12    }
13
14    public function get(): string
15    {
16        // implementasi
17    }
18}
19
20class PgUserRepository implements UserRepository
21{
22    public function set($params): string
23    {
24        // implementasi dengan PostgreSQL
25    }
26
27    public function get(): string
28    {
29        // implementasi
30    }
31}

Kedua class tersebut mengimplementasikan interface yang sama, sehingga kode manapun yang menerima UserRepository tetap dapat menggunakan kedua method tanpa mengetahui implementasinya.

2. Trait

Trait pada dasarnya adalah sekumpulan method yang dapat dicompose ke dalam berbagai class. Biasanya digunakan untuk menyisipkan fungsi-fungsi umum ke beberapa class tanpa menggunakan inheritance.

Contoh:

 1trait HasSlug
 2{
 3    public function generateSlug(string $title): string
 4    {
 5        return strtolower(str_replace(' ', '-', $title));
 6    }
 7}
 8
 9class Blog
10{
11    use HasSlug; // otomatis class Blog memiliki method generateSlug()
12}

3. Favor Composition Over Inheritance

Intinya, kita lebih disarankan menggunakan composition (misalnya melalui dependency injection) dibanding inheritance. Composition lebih fleksibel, mudah di-testing, dan tidak tightly coupled.

Contoh:

 1class User
 2{
 3    protected $name;
 4
 5    public function name(): string
 6    {
 7        return $this->name;
 8    }
 9}
10
11class Blog
12{
13    public function __construct(public User $user) {}
14
15    public function name(): string
16    {
17        return $this->user->name();
18    }
19}

Dalam contoh di atas, kita bisa mendapatkan nilai User.name tanpa harus melakukan inheritance. Ini akan sangat bermanfaat jika konstruktor menerima interface alih-alih class, karena memudahkan saat ingin mengganti implementasi dependency-nya.

Dulu PHP sering dicap jelek dan berantakan—dan memang, dulu nulis PHP bisa bikin pusing sendiri. Tapi setelah memahami fitur-fitur “bahasa modern” ini, saya jadi sadar kalau PHP juga bisa rapi dan elegan. Laravel mungkin menyembunyikan banyak detail, tapi ngerti dasar-dasarnya bikin ngoding jadi lebih menyenangkan.

#php

Balas unggahan ini melalui email ↪