Kritik PHP

PHP merupakan bahasa yang kurang bagus, designnya tidak dipikirkan dengan matang. Banyak sekali keanehan PHP dibanding bahasa lain, dan meskipun PHP sudah mulai agak membaik di versi 5.3 (yang baru dirilis 3 minggu yang lalu), saya masih menunggu PHP6 untuk mencoba lagi.

Kebanyakan orang tidak menyadari bahwa mereka butuh sesuatu, atau bahwa sesuatu itu jelek, sampai mereka diberikan sesuatu yang lebih baik. Di artikel ini saya ingin mengkritik PHP, tapi sebelumnya akan saya contohkan apa yang saya maksud dengan melihat sejarah MySQL.

Awalnya MySQL tidak mendukung transaksi. Komentar pendukung MySQL waktu itu: transaksi itu tidak perlu, yang penting cepat (Bahkan pembuat mysql pun berpikir demikian, coba lihat http://www.genome.ou.edu/mysql_manual.html#Bugs, bagian ” Some things we don’t have any plans to do”). Tapi kemudian transaksi ditambahkan, dengan catatan: kalau mau cepat jangan pakai transaksi. Lalu berikutnya: transaksi adalah salah satu fitur yang kami banggakan.

Nah, saya cukup yakin, isi kritik saya ini kemungkinan akan banyak ditolak oleh orang yang cinta buta pada PHP, setidaknya saat ini. Tapi ketika PHP sudah berkembang, baru akan bisa diterima. Memang begitulah sifat penggemar sesuatu, jadi saya bisa memakluminya.

Saya sendiri pernah memprogram PHP dari sejak PHP3, lalu PHP4, dan sampai awal PHP5. Semakin lama saya mempelajari dan memakai PHP, saya semakin merasakan keterbatasannya. Saya tidak menyangkal bahwa PHP merupakan bahasa yang sangat populer. Namun tidak semua yang populer itu bagus (ingat DBase? Ingat Visual Basic 6? dsb). Bagi pencinta PHP, Anda mungkin bisa berbangga PHP semakin membaik, meski caranya dengan “tambal sulam”, dan meski Anda harus sering menyesuaikan program agar berjalan di PHP terbaru. Mungkin saya akan mencoba lagi PHP di versinya yang keenam, tapi saat ini mari kita bahas satu persatu kelemahan PHP.

Designnya Kurang dipikirkan Dengan Matang

Dari sejarahnya PHP berasal dari proyek pribadi (singkatannya waktu itu: Personal Home Page), dan ditambahi aneka fitur tanpa pertimbangan yang matang (magic_quotes, register_globals, dsb). Mereka kadang menyesali suatu keputusan dan menarik fiturnya (misalnya magic_quotes dan register_globals yang akan ditarik di PHP6), bahkan menurut saya kadang mereka bingung misalnya is_a sempat dianggap deprecated lalu di undeprecated.

Baru-baru ini PHP memiliki fitur namespace (yang sudah ditunggu lama), tapi sayangnya mereka memakai separator \ (backslash). Tidak seperti bahasa lain yang memiliki proses pengambilan keputusan melalui proposal yang kemudian disetujui/ditolak oleh komunitas via diskusi (yang biasanya memakan waktu beberapa minggu/bulan), keputusan memakai backslash diambil dari chatting IRC selama beberapa jam. Mungkin akhirnya orang akan bisa menerima ini, tapi ini bukan sesuatu yang elegan jika Anda beralih dari bahasa lain. Contoh ini saya ambil dari salah satu komentar slashdot.

Java/C#/Python:
Attribute/Method access: foo.bar
Static method access:    Foo.bar
Package access:          foo.bar.baz

Sementara di PHP:

Attribute/Method access: $foo->bar
Static method access:    Foo::bar
Namespace access:        foo\bar\baz

Pada akhir tahun 2005 ada sebuah webcast dari Zend yang berisi presentasi Zend Framework (sayang webcastnya tidak bisa saya temukan, linknya sudah mati, tapi Anda bisa melihat rangkumannya di blog ini). Framework tersebut berusaha meniru Ruby on Rails dalam masalah ActiveRecord, tapi ada satu masalah besar.

Masalah besarnya adalah: isi webcast tersebut tidak mungkin bisa diimplementasikan dengan PHP yang ada saat itu, dan bahkan baru bisa diimplementasikan di PHP 5.3 yang baru dirilis 3 minggu yang lalu. (ok sebenarnya dengan trik yang sangat jelek, dan membuat aplikasi jadi super lambat, itu bisa dilakukan, tapi secara praktis itu tidak bisa dilakukan). Sebagai catatan, PHP 5.3 menambahkan fitur late static binding sehingga sekarang isi webcast tersebut bisa diimplementasikan.

Perlu dicatat, metode tambal sulam dalam memperbaiki fitur PHP menyebabkan banyak program PHP3 tidak berjalan di PHP4, dan program PHP4 tidak berjalan di PHP5. Itu sebabnya Anda akan melihat banyak hosting yang masih menyediakan PHP versi 4 walau versi 5 sudah ada sejak tahun 2004 (5 tahun yang lalu).

Tidak konsisten

PHP memiliki banyak fungsi di namespace utama (lebih dari 3000 fungsi), namun penamaan fungsi sangat tidak konsisten:

  • ada yang memakai underscore, dan ada yang tidak (isset, is_object, dsb)
  • urutan verb object atau object verb tidak seragam, misalnya base64_decode bentuknya: object verb, sedangkan recode_string bentuknya verb object
  • fungsinya banyak yang redundan (pencarian string: strstr , strchr, strpos, dsb, sorting: sort, arsort, asort, krsort, ksort, natsort, natcasesort, rsort, usort, dsb)
  • pemakaian to dan 2 yang tidak seragam: ascii2ebcdic, strtolower

Daftar di atas itu hanya komplain saya, masih banyak hal lain yang lengkapnya bisa dibaca di url http://tnx.nl/php.html

Struktur Data

Tahukah Anda bahwa array di PHP sebenarnya adalah hashtable? Apa konsekuensinya: pertama ini butuh memori yang lebih banyak. Di C/Pascal/C++, dsb setiap elemen dalam sebuah array of integer akan membutuhkan space 4 byte. Dalam PHP, setiap elemen integer butuh 68 byte, berari overheadnya sangat besar (17 kali lipat dibanding array biasa). Detailnya: 6 byte untuk struktur value (zval), 36 byte untuk hash bucket, dan 2*8 = 16 byte untuk header alokasi memori. Ini pun hanya di sistem 32 bit, di sistem 64 bit penggunaan memorinya 2 kali lipatnya. Biasanya kita memiliki tradeoff memory vs speed. Dalam kasus ini kita memiliki konsekuensi kedua: akses array memiliki kompleksitas yang lebih besar dari O(1), sehingga lebih lambat di banding aneka bahasa lain. Tepatnya: tergantung dari cara Anda mengakses array, kompleksitasnya berbeda-beda (misalnya sebagian mengkomplain array_shift yang terlalu lambat, lebih lambat dari membalik array dan mem-pop hasilnya).

Di PHP 5.3 diperkenalkan kelas SplFixedArray untuk tipe array yang benar-benar array (area kontigu di memori). Mereka juga memperkenalkan kelas-kelas lain yang lebih cepat dan hemat memori, yaitu: SplDoublyLinkedList, SplStack, SplQueue, SplHeap, SplMaxHeap, SplMinHeap, SplPriorityQueue, dan SplObjectStorage. Sebagai catatan, array 1000 elemen yang tadinya butuh sekitar 200kb di php lama, dengan SplFixedArray sekarang hanya butuh sekitar 60 kb (catatan: saya menggunakan sistem 64 bit).

Perlu dicatat juga bahwa sebelum PHP 5.3 jika kita memiliki circular reference, maka garbage collector PHP tidak bisa menghapus objek-objek yang terbelit dalam circular reference. Dalam program yang berjalan lama, bug memori karena circular reference ini bisa menumpuk, Jadi PHP sebelum 5.3 tidak cocok untuk operasi yang berjalan lama (misalnya untuk daemon), kecuali kita memprogram dengan sangat berhati-hati.

Penutup

PHP merupakan bahasa yang sangat populer. Dengan adanya banyak pengguna, maka banyak pula demand untuk memperbaiki bahasa ini dan memperbaiki implementasi interpreternya. Karena itu kemungkinan bahasa ini memiliki masa depan yang cukup baik. Namun saat ini sudah mulai ada banyak pesaing PHP, sehingga PHP harus berusaha secepat mungkin membenahi diri agar tidak terlibas oleh bahasa lain. PHP6 yang sudah bertahun-tahun dikembangkan saya harap bisa menyenangkan banyak orang.

Microsoft pernah membuat bahasa yang super populer: Visual Basic (sampai versi 6). Tapi mereka menyadari keterbatasan dan kekurangan bahasanya, dan menggantinya dengan Visual Basic .NET yang sangat baik (dari paradigma OOP). Kiranya hal yang sama bisa terjadi di dunia PHP.

Link Tambahan

Bagi Anda yang tertarik dengan internal PHP, beberapa link ini mungkin bisa menambah wawasan Anda:

Implementasi Hashtable di PHP (artikel lama, sekarang strukturnya sudah agak berubah)

Masa depan PHP6 (artikel dari tahun 2008)

Benchmark Array dan Tipe Data Baru

9 komentar pada “Kritik PHP”

  1. Masalah penamaan fungsi yang tidak konsisten, si Rasmus Lerdorf sendiri mengakui bahwa:
    “[he] can’t really argue with these criticisms, but [he] can at least attempt to explain how and why we got to this state.”
    “[he] tended to steal/borrow ideas from other languages and APIs [he] was familiar with. […] People familiar with these various sources were quite at home with the naming in PHP. PHP was never so much a standalone language as it was an interface between the Web server and all the various back-end tools you wanted to hook into the Web server. Consequently, when people look at PHP today as a standalone language without taking its context into account, it can appear somewhat inconsistent.”
    (from Do You PHP? By Rasmus Lerdorf — http://www.oracle.com/technology/pub/articles/php_experts/rasmus_php.html?text=1)

  2. yah, well…
    gak bisa disalahin juga seh…
    orang banyak ke PHP juga karena banyak web host yang mendukung PHP 😛
    telur dan ayam 😀

  3. Nice post…
    Padahal satu hal yang saya suka dari PHP adalah array-nya… mudah digunakan… ternyata punya trade-off seperti itu…

  4. Gitu ya om, saya pendatang baru n baru belajar PHP, dengan membaca semua post yg ditulis, sangat malu saya begitu jauh skill saya dibanding om, saya mengharap bisa sharing dengan om masalah programing, kiranya bisa add ym saya jika berkenan : ih_crew
    Thanks
    Buat mas petra.barus saya suka blog sodara tentang yii, trus diupdate ya mas biar saya bisa belajar, n saya mau share juga dengan mas

  5. Cool…

    Meski profesi saya sebagai Java Developer, saya juga menggunakan PHP dalam web saya untuk tujuan research, terutama Javascript Framework dan CSS. dan semuanya. Salah satu kritik saya terhadap PHP, meski tidak pernah saya publish seperti ini (karena kurang narasumber) adalah kecurigaan saya terhadap borosnya pemakaian memory pada Array di PHP. Dengan adanya posting seperti ini menjadi bertambah pengetahuan saya.
    Terima kasih atas postingnya..

    Regards

    Josescalia

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *