Fungsi Query Otomatis dengan Magic Method __call

Magic Method

Pada tulisan sebelumnya, saat membahas overloading pada PHP, telah disebutkan secara sekilas tentang penggunaan magic method __call. Dan pada tulisan kali ini akan dibahas bagaimana contoh penerapan magic method __call untuk membuat fungsi yang menjalankan query database secara otomatis.

Skenario Contoh yang Akan Dibuat

Anggap saja di dalam database perpustakaan kita memiliki table-table sebagai berikut :

  • kategori
  • buku
  • member
  • pinjaman

Dan kita akan membuat sebuah class, di mana object dari class tersebut memiliki fungsi untuk melakukan query terhadap masing-masing table, misalnya :

  • $obj->getKategori();
  • $obj->getBuku();
  • $obj->getMemberById(24);
  • $obj->getBukuByAuthor(“Abdul Hakim”);
  • dan seterusnya…

Menariknya adalah di masing-masing fungsi, kita tidak perlu menuliskan terlebih dahulu method di dalam class nya, dan tidak perlu menuliskan querynya masing-masing. Pada contoh di atas database perpustakan memiliki 4 table, bayangkan jika dalam project yang sedang kita kerjakan memiliki 50 atau 100 table, tentunya ini akan mengurangi penulisan script untuk melakukan query ke masing-masing table dan mempercepat pengerjaan.

Mengenal Magic Method __Call

Magic method __call akan dijalankan manakala ada pemanggilan terhadap method yang tidak didefinisikan sebelumnya di dalam sebuah object.

class Auto {
    public function __call($method,$args) {
    }
}
$auto = new Auto();
/* Fungsi ini akan memanggil script yang ada di dalam __call */
$auto->getMember();

 

Manipulasi String untuk Query Otomatis

Fungsi __call akan melewatkan nama method sebagai argumen pertama, dan array dari parameter methodnya sebagai argumen kedua. Oleh karena itu untuk method pada contoh script di atas :

$auto->getMember();

Maka akan mengirimkan string “getMember” untuk dilewatkan ke dalam __call, lantas script di dalam __call akan melakukan seleksi data dari tabel member. Demikian seterusnya, getKategori akan melakukan seleksi data dari tabel kategori, getPinjaman dari tabel pinjaman, getBuku dari tabel Buku.

Berikut ini adalah script untuk melakukan manipulasi string argumen pertama (nama method) yang dilewatkan ke dalam __call, untuk kemudian melakukan query ke tabel sesuai dengan yang disebutkan di nama methodnya.

public function __call($method,$args) {
    preg_match_all(‘/((?:^|[A-Z])[a-z]+)/’,$method,$params);
    $result = array() ;
    if ($params[0][0]==’get’) {
        $conn = new mysqli(‘localhost’,’root’,”,’perpustakaan’); //diisi sesuai settingan mysql anda
        $sql = ‘SELECT * FROM ‘.strtolower($params[0][1]);
        $query = $conn->query($sql);
        while($row = $query->fetch_assoc()){
            $temp = array();
            foreach($row as $key => $value) {
               $temp[$key] = $value;
            }
            $result[] = (object)$temp;
        }
    }
    return $result;
}

 

Saat kita memanggil fungsi misalnya getMember, maka akan mengembalikan semua record yang ada di dalam tabel member. Demikian pula getKategori, getUser, dan seterusnya.

Rekan-rekan pembaca juga bisa mengembangkan manipulasi stringnya supaya bisa ditambah filter atau limit, dan lain sebagainya. Intinya adalah bagaimana kita memanfaatkan magic method __call untuk melakukan query secara otomatis ke berbagai table yang berbeda tanpa harus menuliskan secara eksplisit masing-masing fungsi dan query nya.

Sisi Lain

Di sisi lain, saat saya sedang merancang tulisan ini. Saya juga berdiskusi dengan beberapa rekan yang lebih senior. Ada beberapa input dari mereka terkait penggunaan magic method. Sebagian rekan menyampaikan bahwa magic method is slow, lambat. Ada rekan lain mengatakan bentrok dengan single responsibility principle, dengan design pattern. Dan lain-lain.

Dan saya menampung semua masukan itu dengan baik. Artinya masih banyak yang perlu saya pelajari lagi. Tapi terlepas dari itu semua, magic method ini ada di dalam PHP. Tetap layak untuk dikaji. Dan bagaimana efektif penggunaannya tentu dikembalikan sesuai dengan kebutuhan kita di pekerjaan.