Technology

5 Kesalahan Umum Yang Ternyata, Sebagian PHP Developer Lakukan

Retha Christiani
December 14, 2017

Share

vector-illustration-of-a-man-working-on-the-computer_1441-26-1.jpg

Sering kali seseorang membaca di beberapa forum internet maupun obrolan sesama programmer yang mengatakan bahwa PHP merupakan bahasa pemrograman yang tidak konsisten, punya banyak annoying behavior, dan dari awal memang tidak didesain dengan baik. Beberapa orang meng-iya-kan opini-opini tersebut karena mungkin yang mereka rasakan memang demikian.

Lalu, kenapa PHP masih menjadi primadona?

man-doubting-design_1133-263-1.jpg

Hal ini dikarenakan PHP merupakan bahasa pemrograman yang relatif mudah dipelajari. Kurikulum perkuliahan biasanya juga menggunakan PHP untuk diajarkan ke mahasiswa-mahasiswanya. Selain itu komunitas yang besar serta kompabilitas terhadap hosting (terutama yang shared hosting) menjadi nilai plus yang membuat PHP masih menjadi pilihan para pengembang web di seluruh dunia.

 

Hanya saja memang ada beberapa, yang seperti dikatakan tadi, annoying behavior di PHP. Hal itu akan dirangkum menjadi 5 point berikut.

1. Membiarkan memory reference menggantung tanpa di unset()

Misalnya ada sebuah contoh kasus di mana saya ingin mengkalikan nilai dari setiap elemen array dengan 2.

Contoh:

https://gist.github.com/cjzeven/74f42a10c258c997b462ab79093e4496

Pada contoh kode di atas, kita menggunakan teknik passing by reference sehingga kita tidak perlu membuat sebuah variabel baru untuk menampung nilai dari hasil perkalian tadi sehingga lebih efisien.

Sekilas tidak ada yang salah dengan kode di atas. Tapi coba tebak, kira-kira apa yang terjadi jika di re-assign variabel $value dengan sebuah nilai baru?

https://gist.github.com/cjzeven/7e3f209b47f954acca969b8fdf77c9df

Melakukan re-assign terhadap variabel $value akan berdampak pada array $arr. But how? Bukannya variabel $value berada pada scope foreachya? Sayangnya tidak, foreach tidak membuat sebuah blok scope sendiri seperti yang kita perkirakan. Dan karena variabel $value masih menampung reference dari indeks array terakhir yaitu $arr[4], maka jika kita re-assign sebuah nilai baru maka akan berdampak pada $arr itu sendiri.

Berikut satu contoh kasus yang sedikit lebih rumit:

https://gist.github.com/cjzeven/08cdb54e6938ee30cb01d24ebbd64097

Itu array yang terakhir typo ya? Kok nilai terakhirnya 2 bukan 3? Suer, itu bukan typo. Mari kita perhatikan bagaimana program kita bekerja sekali lagi.

Di line 9, kita melakukan iterasi untuk setiap elemen dari array $arr. Ketika proses iterasi selesai, variabel$value akan bernilai reference dari indeks terakhir dari array $arryaitu indeks $arr[2] dengan nilai 3.

Di line 14, kita melakukan iterasi lagi, tapi kali ini menggunakan passing by value. Program akan melakukan passing nilai dari indeks $arr[0] (yaitu 1) ke variabel $value. Apa yang terjadi selanjutnya? Jelas, nilai akan disimpan di $arr[2] karena $value berisi reference dari $arr[2]. Maka nilai $arrsekarang menjadi seperti ini:

[1, 2, 1]

Iterasi lalu dilanjutkan kembali, kali ini yang di passing adalah $arr[1]dengan nilai 2. Nilai 2 lagi-lagi akan disimpan di $arr[2]. Jadi sekarang nilai $arr kita menjadi seperti ini:

[1, 2, 2]

Iterasi dilanjutkan kembali, kali ini $arr[2] bernilai 2. Tentu saja indeks terakhir akan tetap bernilai 2.

Lalu tindakan preventif apa yang dapat kita lakukan untuk menghindari potensi bug seperti ini? Kita dapat menggunakan fungsi unset() untuk menghilangkan reference yang mengambang tersebut.

https://gist.github.com/cjzeven/057aff01d98e67cf5f0ee6703b91b260

 

2. Perilaku dari fungsi isset() yang tidak konsisten

Seperti yang terdeskripsikan dari namanya, fungsi isset() akan melakukan pengecekan jika sebuah item exist atau sudah di set (sudah di inisialisasi sebelumnya). Contohnya seperti ini:

https://gist.github.com/cjzeven/8b987658dd948a6bbf6df581f31c64f4

Oke, straight forward ya. Jika kita hapus line 3, maka hasilnya adalah “Data is not set.”. Sampai di sini fungsi isset() melakukan tugasnya dengan baik. Namun, jika variabel $data kita assign dengan null. Kira-kira apa yang terjadi? variabel $data dianggap tidak exist, padahal variabel $data sudah kita deklarasikan, walaupun dengan nilainull.

https://gist.github.com/cjzeven/c426a822e1469b5ef269ebc6a3e6575a

Lalu bagaimana caranya jika kita ingin benar-benar mengetahui suatu variabel exist atau tidak? Kita dapat menggunakan kombinasi 2 fungsi yaitu array_key_exists() dan get_defined_vars().

https://gist.github.com/cjzeven/11d0c8c6429e28b7b0393730ebfe6e68

 

3. Melakukan query di dalam perulangan

Mengeksekusi query terpisah (separated query) di dalam sebuah loop merupakan ide yang buruk dan sebisa mungkin harus dihindari penggunaannya.

https://gist.github.com/cjzeven/4ff7f1e42c2c8b3a8330709f1c5a420e#file-query-example-1-php

Dari kode di atas, terlihat bahwa banyaknya query akan bergantung dari jumlah id yang ada. Semakin banyak id, maka semakin banyak pula queryyang di eksekusi. Bayangkan jika ada 1000 id, maka ada 1000 query yang kita jalankan ke database.

Bagaimana kalo kita menggunakan operator IN saja sehingga tidak perlu melakukan perulangan query seperti di atas.

https://gist.github.com/cjzeven/ebd572adb85e4197bdb26cfba9c7a654#file-query-example-2-php

Terlihat kita hanya perlu melakukan satu kali eksekusi query ke dalam database sehingga penggunakan memory menjadi lebih optimal.

 

4. Menggunakan fungsi empty() di segala situasi pengecekan

Beberapa programmer, pasti pernah menggunakan fungsi empty() untuk melakukan boolean check bukan? Tapi kadang ada beberapa kasus yang membingungkan seperti berikut ini:

https://gist.github.com/cjzeven/3d0fb21d6a070451a466a5197c965e58#file-empty-example-1-php

Pengecekan menggunakan fungsi empty() hanya bekerja untuk array. Sedangkan untuk tipe array object (objek yang meniru/mimicfungsionalitas dari array) akan mengembalikan nilai false.

Perhatikan lagi kode dibawah ini.

https://gist.github.com/cjzeven/fd27dcb4b43c74af5920032202dbdfea#file-empty-example-2-php

Kedua atribut akan menghasilkan nilai yang sama yaitu “Something”. Tapi coba kita lakukan boolean check menggunakan fungsi empty(). Kira-kira fungsi empty() akan mengembalikan nilai apa di kedua atribut tersebut?

https://gist.github.com/cjzeven/865c53a47cb3964f6fd63f16b737dfc2#file-empty-example-3-php

Walaupun mengembalikan nilai “Something”, pemanggilan atribut menggunakan magic method __get akan mengembalikan nilai true oleh fungsi empty().

Untuk contoh pertama, kita bisa menghindari hal tersebut dengan menggunakan fungsi count().

https://gist.github.com/cjzeven/b459ae2590ff504e08e5c7296f7a066a#file-empty-example-4-php

Namun untuk contoh yang kedua, saya sendiri belum menemukan cara terbaik untuk melakukan boolean check pada kasus itu. Kalo ada teman-teman yang tahu caranya mungkin boleh berbagi di kolom komentar di bawah.

 

5. Mengabaikan coding standart

Memang coding standart tidak berdampak langsung terhadap kode yang kita buat atau terhadap performa dari aplikasi kita. Tapi coding standart dapat membantu proses maintain dan kolaborasi antar sesama programmer.

Di PHP sendiri kita mengenal PSR (PHP Standarts Recommendation). Beberapa perusahaan terkenal yang berkontribusi dalam project ini diantaranya adalah Zend, Drupal, Symfony, Joomla, dll. Jadi sepertinya tidak ada alasan buat tidak ngikutin standar PSR ini.

Kesimpulan

Dalam kenyataannya, PHP memang masih jauh dari kata sempurna. Walaupun begitu kita bisa melihat perkembangannya yang jauh lebih mature dan berkembang pesat sekarang. Terlebih lagi dengan munculnya PHP 7 yang menghadirkan beberapa fitur baru (meski fitur-fitur tersebut sebenarnya sudah jauh lebih dulu ada di bahasa pemrograman lain). Mending terlambat deh daripada tidak sama sekali. 

 

 

Inspired by:  https://www.toptal.com/php

edit by: Adentya

Image Sources: freepik

 

Kali ini wonderlabs mengeluarkan panduan gaji yang dapat Anda download gratis.

New Call-to-action

 

Saat ini klien kami sedang mencari kandidat-kandidat terbaik untuk bekerjasama dengan mereka.  Jika Anda tertarik, Anda dapat langsung mendaftarkan diri Anda dengan klik gambar dibawah ini 

New Call-to-action

Comments