Perbezaan antara Python, Ruby dan PHP.

Assalamualaikum semua, apa khabar, dalam post ini, saya akan mencabar diri saya untuk memperjelaskan perbezaan antara Python, Ruby dan PHP dalam kontext pengatucaraan laman sesawang. Cabaran sebenar saya dalam post ini sebenarnya adalah menggunakan bahasa melayu sebanyak yang mungkin. Sesuatu yang sukar dilakukan memandangkan ini adalah bidang perkomputeran yang mana kebanyakan dokumentasi adalah dalam bahasa Inggeris. 

Sebelum saya mulakan, pertama sekali saya perlu memberitahu pembaca sekelian bahawa saya sendiri bukanlah seorang pakar dalam mana-mana bahasa pengatucaraan tersebut. Malahan pada pendapat saya saya tidak mempunyai cukup pengalaman dalam pengatucara laman web. Namun begitu, saya pernah menghasilkan laman web berasaskan PHP menggunakan CodeIgniter dan Laravel, Ruby menggunakan Ruby on Rails serta Python menggunakan Flask dan Django. Walaubagaimanapun, saya tidak mempunyai pengetahuan yang mendalam dalam mana-mana rangka kerja (framework).

Ketiga-tiga bahasa pengatucaraan ini adalah bahasa pengatucaraan ditafsirkan (interpreted) serta bahasa pengatucaraan yang dinamik. Walaubagaimanapun, ketiga-tiga bahasa ini mempunyai sintaks yang cukup berbeza. Python dan Ruby direka lebih kepada pengatucarran am manakala PHP sebenarnya lebih fokus kepada pemprosesan teks. Mungkin disebabkan itu, dalam bidang pengatucaraan laman sesawang, PHP mempunyai pengguna yang paling ramai. Tetapi ketiga-tiganya mampu untuk digunakan sebagai bahasa pengatucaraan laman sesawang dengan baik. Saya rasa perlu saya jelaskan disini bahawa apabila saya kata pengatucaraan laman sesawang, maksud saya bahasa pengatucaraan di bahagian pelayan(server) yang berinteraksi dengan pangkalan data untuk menjana HTML, CSS dan JavaScript yang difahami oleh pelayar laman sesawang. Menariknya lagi, antara ketiga-tiga bahasa ini, Python adalam bahasa pengatucaraan yang paling tua. Kemudian muncul PHP dan kemudian Ruby pada tahun 1990-an. Mari kita lihat satu persatu antara ketiga-tiga bahasa pengatucaraan ini bermula dengan Python.

Python

Python adalah bahasa pengatucaraan yang direka untuk pengatucaraan am. Dalam dunia Linux, Python adalah bahasa pengatucaraan yang sangat popular sehinggakan hampir semua pengedaraan linux (linux distribution) menyertakan penterjemah Python pra-memasang(preinstalled). Berbeza daripada kebanyakan bahasa pengatucaraan yang lain, sintaks Python mementingkan indentasi. Indentasi digunakan untuk membezakan atara satu blok kod dengan blok yang lain.

[python]def fungsi_satu(param):
buat_sesuatu()
pembolehubah=123
if(pembolehubah==90):
buat_sesuatu_yang_lain()
else:
buat_sesuatu_lagi()
[/python]

Penekanan terhadap indentasi ini memaksa pengatucara untuk menghasilkan kod yang jelas dan mudah dibaca. Kod yang jelas dan mudah dibaca memudahkan proses penyelenggaraan kod. Perkara ini menjadikan Python sebagai bahasa pengatucaraan kegemaran ramai. Namun begitu, pemaksaan indentasi ini boleh memanjangkan kod, dan melarang beberapa penyataan ditulis dalam satu baris sekaligus. Sebagai contoh, dalam JavaScript, sering kali kita perlu untuk memindahkan satu fungsi ke fungsi yang lain sebagai parameter. Disebabkan dalam Python, fungsi juga adalah objek, Python juga boleh menerima fungsi lain sebagai parameter, namun disebabkan indentasi yang dipaksa, fungsi itu perlu diistiharkan terlebih dahulu. Contoh:

[javascript]//JavaScript
function fungsi_satu(param){
param("111");
}
fungsi_satu(function(par){
mari_lakukan_sesuatu(par);
});

//JavaScript alternatif
(function(param){param("111");})(function(par){mari_lakukan_sesuatu(par)});
[/javascript]
[python]
#python
def fungsi_satu(param):
param("111");
def fungsi_dua(par):
mari_lakukan_sesuatu(par);
fungsi_satu(fungsi_dua);
[/python]

Python menekankan kod yang jelas serta terang apa yang kod itu lakukan(explicit). Berbeza dengan sesetengah bahasa pengatucaraan lain setiap file atau modul mempunyai ruangan global tersendiri yang boleh di-“import” oleh module yang lain. Dalam Python, satu modul adalah satu file atau folder. Sebagai contoh, jika pengatucara mahu menggunakan kod dari file bernama kelas_satu.py, terlebih dahulu, pengatucara perlu menaip ‘import kelas_satu’. Untuk setiap fungsi dalam file kelas_satu, untuk mengaksesnya, pengatucara perlu menambah ‘kelas_satu.’ dihadapan nama fungsi tersebut sepert ‘kelas_satu.fungsi_satu’. Pengatucara juga boleh menggunakan kata kunci ‘from kelas_satu import fungsi_satu’ untuk menggunakan fungsi_satu tanpa perlu menambah ‘kelas_satu.’ . Setiap modul mempunyai nama yang sama dengan nama file atau folder. Kesannya, kod Python lebih mudah untuk diselenggara kerana kebanyakan fungsi atau pembolehubah yang digunakan dalam satu file boleh dicari asal-usulnya.

Dari segi kebolehan, Python mempunyai kebanyakan ciri-ciri bahasa pengatucaraan modern seperti kelas, modul dan pewarisan (inheritance). Python menggunakan pewarisan bebilang (multiple inheritance) seperti C++. Ini bermakna satu kelas boleh mewarisi beberapa kelas yang lain. Berbeza dengan C++ dan Java, dalam kelas Python, untuk mengakses pembolehubah ahli, python memaksa penggunaan kata kunci “self” yang bermaksud objek kepada kelas tersebut. Seperti javascript, Python juga boleh menggunakan duck typing.

[python]
class Kelas1(object):
def __init__(self,param):
self.ahli=param
def apa_ahli(self)
return self.ahli

def buat_kelas(param):
return Kelas1(param)

def cobaan(param1,param2):
if(param1("1").apa_ahli()==param2("1").apa_ahli()):
print("Betul!")

#contoh duck typing
#kedua-dua akan print Betul!
cobaan(buat_kelas,Kelas1)
cobaan(Kelas1,buat_kelas)
[/python]\

Kelas Python juga bersifat terbuka. Ini bermakna, sesuatu kelas python boleh diubah secara dinamik. Pembolehubah ahli kepada object boleh ditambah dan diubah secara dinamik oleh mana-mana kod yang lain. Python tidak mempunyai pembolehubah akses(access modifier). Namun begitu, terdapat satu kelaziman dimana pembolehubah yang bermula dengan simbol ‘_’ dianggap seperti peribadi(private). Antara fungsi-fungsi unik yang ada pada Python adalah seperti penghias (decorator) dan pemahaman senarai (list comprehension). Penghias Python membolehkan pengatucara untuk mengubah sesuatu Callable dengan mengubah input dan output fungsi tersebut. Pemahaman senarai pula merupakan sejenis penyataan untuk memanipulasi senarai.

[python]
def contoh_penghias(fungsi):
def berubah(x):
return "—"+fungsi(x)+"—"
return berubah

@contoh_penghias
def fungsi_satu(x):
return str(x*x)

print(fungsi_satu(5))
#akan print "—25—"

senarai_satu=[1,2,3,4,5]
#contoh pemahaman senarai
senarai_dua=[x*x for x in senarai_satu] #akan menghasilkan [1,4,9,16,25]
senarai_tiga=[x for x in senarai_dua if x != 4] #akan menghasilkan [1,9,16,25]
[/python]

Dari segi pengatucaraan laman sesawang, Python mempunyai protokol rasmi untuk tujuan itu yang dipanggil WSGI. Python juga boleh digunakan menerusi protokol CGI, namun penggunaannya tidak efisien memandangkan pentafsir Python perlu dimuat semula untuk setiap permintaan HTTP. WSGI membolehkan satu proses Python untuk melayan beberapa permintaan HTTP pada waktu yang sama. Dari segi rangka kerja applikasi laman sesawang, Django adalah pilihan paling popular. Django adalah rangka kerja applikasi laman sesawang yang lengkap dengan pelbagai utiliti yang berguna seperti model hubungan objek, utility borang, template dan modul pengesahan. Selain Django, terdapat pelbagai rangka kerja yang lain seperti Pylon, Pyramid, Flask dan Bottle.

Diantara ketiga-tiga bahasa pengatucaraan ini, saya anggarkan Python adalah yang paling kurang terkenal dalam bidang pengatucaraan laman sesawang. Perkara ini adalah mungkin kerana adalah agak sukar untuk memasang applikasi laman sesawang Python. Hal ini menyebabkan jarang pembekal hosting perkongsian menyediakan infrastruktur untuk memasang applikasi laman sesawang Python. Namun begitu, terdapat pelbagai pembekal platform sebagai perkhidmatan yang menawarkan hosting laman sesawang Python seperti Heroku, Engine Yard, malahan antara bahasa pengatucaraan yang disokong oleh Google App Engine adalah Python.

Ruby

Ruby adalah satu bahasa pengatucaraan yang sedang meningkat terkenal terutama dalam bidang pengatucaraan laman sesawang. Peningkatan populariti ini berkemungkinan besar disebabkan oleh rangka kerja applikasi laman sesawang Ruby on Rails yang semakin hari semakin ramai peminat. Ruby mempunyai pelbagai fungsi menarik dan unik berbanding kebanyakan bahasa pengatucaraan yang lain. Ruby mementingkan kod yang kemas dan cantik serta mudah dibaca tetapi tidak mementingkan bagaimana sesuatu kod itu berfungsi atau jika terdapat operasi yang mengelindung. Hal ini berbeza dengan falsafah Python yang mementingkan implimentasi yang jelas serta tiada perkara yang menyelindung. Sintaks Ruby banyak memberi pilihan kepada pengatucara bagaimana untuk melakukan sesuatu. Malahan utility standard Ruby banyak mengandungi fungsi yang mempunyai banyak alias.

Saya boleh katakan pada masa ini, mungkin Ruby adalah bahasa pengatucaraaan yang paling saya gemari. Ini adalah kerana ia mempunyai struktur yang membolehkan kita untuk seakan-akan menambah fungsi bahasa pengatucaraan ini. Blok kod dalam Ruby bermula dengan kata kunci sepert ‘if’ atau ‘while’ dan berakhir dengan kata kunci ‘end’. Ruby tidak memaksa indentasi yang tepat. Ruby juga tidak mewajibkan penggunaan symbol ‘(‘ dan ‘)’ untuk memanggil sesuatu fungsi. Menariknya lagi, setiap fungsi Ruby, akan sentiasa mengembalikan nilai ekspressi terakhir tanpa perlu menggunakan kata kunci ‘return’.

[ruby]
def fungsi_satu(parameter)
if parameter == "ya"
puts "Anda bagi ya"
else
puts "Anda tidak bagi ya"
end
"Tidak perlu menggunakan kata kunci ‘return’ "
end

puts fungsi_satu("ya")
# akan print ke terminal
# "Anda bagi ya"
# "Tidak perlu menggunakan kata kunci ‘return’ "
[/ruby]

Pada pendapat saya, keunikan utama ruby berbanding bahasa lain adalah kebolehan fungsi untuk menerima satu blok kod. Dalam Ruby, fungsi bukanlah satu objek seperti dalam Javascript atau Python. Tetapi fungsi boleh menerima blok kod. Contoh:

[ruby]
def buat_tiga_kali
i = 0
while i < 3
yield i
i = i+1
end
end

buat_tiga_kali do |kiraan|
puts "Kali ke #{kiraan}"
end
# akan print:
# "Kali ke 0"
# "Kali ke 1"
# "Kali ke 2"

buat_tiga_kali { |kiraan| # sintaks alternatif
puts "Kali ke #{kiraan}"
}
[/ruby]

Dalam contoh ini, fungsi buat_tiga_kali boleh menerima satu blok dan ia akan menjalankan blok tersebut tiga kali sambil memberikan parameter ke blok tersebut. Ia seolah-olah memberi fungsi kepada fungsi yang lain sebagai parameter seperti yang sering dilakukan dalam Javascript, tetapi dilaksanakan dengan jauh lebih kemas dan hanya boleh memberi satu blok secara terus. Dengan ini, pengatucara seolah-olah boleh menambah kata kunci baru. Contoh, berikut saya menghasilkan satu fungsi yang bertindak seperti kata-kunci ‘if’, tetapi menggunakan perkataan ‘jika’.

[ruby]
def jika keadaan
if keadaan
yield
end
end

jika 1 < 3 do
puts "Satu kurang dari tiga"
end
#akan print "Satu kurang dari tiga"
[/ruby]

Mari kita beralih kepada ciri-ciri Ruby yang lain yakni struktur objek Ruby. Ruby mempunyai pembolehubah akses seperti C++ dan Java. Namun begitu, pembolehubah ahli hanya boleh diakses dari dalam kelas. Ini bermakna kita perlu membuat fungsi untuk mengakses dan mengubah pembolahubah ahli. Namun begitu, sintaks Ruby yang tidak mewajibkan penggunaan symbol ‘(‘ dan ‘)’ serta sintaks istimewa ruby yang membolehkan nama fungsi untuk berakhir dengan symbol ‘=’, membolehkan kita untuk seolah-olah mengakses pembolehubah itu secara terus. Namun sebenarnya, apabila kita mengakses pembolehubah tersebut atau mengubah pembolehubah tersebut, kita sedang memanggil fungsi dalam objek. Ia bertindak seperti kebolehan ‘property’ C#, tetapi tiada sintaks istimewa. Ruby juga membenarkan nama fungsi untuk berakhir dengan symbol ‘?’ dan ‘!’, membolehkan pengatucara untuk menanda fungsi sebagai pertanyaan atau merbahaya.

[ruby]
class Contoh
public # Pembolehubah akses seperti C++
def nilai
@nilai # Pembolehubah ahli sentiasa dimulakan dengan simbol ‘@’
# Pembolehubah lain tidak boleh bermula dengan simbol ‘@’
end
def nilai= val
@nilai = val
end
def nilai_adalah? val
@nilai == val
end
def ubahkan_nilai!
@nilai = "Berubah"
end
end

contoh = Contoh.new # cara buat objek dalam Ruby
contoh.nilai = "teks satu"
puts contoh.nilai
contoh.nilai = "teks dua"
if contoh.nilai_adalah? "teks dua"
puts "Ya, nilai adalah teks dua"
end
contoh.ubahkan_nilai!
puts contoh.nilai

# Akan print:
# "teks satu"
# "Ya, nilai adalah teks dua"
# "Berubah"
[/ruby]

Objek Ruby menggunakan pewarisan tunggal (single inheritence) seperti Java. Dalam kata yang lain, setiap kelas Ruby hanya boleh mewarisi dari satu kelas yang lain. Ruby tidak mempunyai ‘interface’ seperti Java. Namun, seperti Python, Ruby menyokong penggunaan Duck Typing. Ruby juga mempunyai konsep yang dipanggil ‘mixin’ dimana satu kelas boleh menyertakan fungsi dari beberapa module seolah-olah mewarisi dari beberapa modul.

[ruby]
class Manusia
def orang?
true
end
end

module KebolehanMemasak
def masak
puts "sedang memasak"
end
end

module KebolehanMelukis
def lukis
puts "sedang melukis"
end
end

class OrangA < Manusia
include KebolehanMemasak
include KebolehanMelukis

def siapa_kamu?
puts "saya orang A. Saya boleh memasak dan melukis."
end
end

oranga = OrangA.new
if oranga.orang?
puts "Memang orang"
end
oranga.siapa_kamu?
oranga.masak
oranga.lukis

# Akan print
# "Memang orang"
# "saya orang A. Saya boleh memasak dan melukis."
# "sedang memasak"
# "sedang melukis"
[/ruby]

Menariknya lagi, Ruby membenarkan pengatucara untuk memanggil fungsi statik dalam definisi kelas itu sendiri. Kebolehan ini membolehkan pengatucara untuk melakukan pengatucaraan meta dengan sangat mudah. Contoh:

[ruby]
class FungsiPemudahDefinisi
def self.buat_fungsi_untuk_pembolehubah nama_pembolehubah #antara cara untuk membuat fungsi statik adalah memulakan nama fungsi dengan "self."
self.class_eval "
def ubah_#{nama_pembolehubah} param
@#{nama_pembolehubah} = param
end
def ambil_#{nama_pembolehubah}
@#{nama_pembolehubah}
end
"
end

buat_fungsi_untuk_pembolehubah "kiraan"
buat_fungsi_untuk_pembolehubah "lagikiraan"
end

objek = FungsiPembudahDefinisi.new
objek.ubah_kiraan 10
objek.ubah_lagikiraan 20
puts "Kiraan adalah #{object.ambil_kiraan}"
puts "Lagikiraan adalah #{object.ambil_lagikiraan}"
# akan print
# "Kiraan adalah 10"
# "Lagikiraan adalah 20"
[/ruby]

Dalam contoh diatas, pengatucara boleh membuat fungsi pengakses (accessor) untuk pembolehubah ahli dengan menggunakan fungsi statik ‘buat_fungsi_untuk_pembolehubah’ serta mengertakan nama pembulehubah sebagai parameter pertama. Dalam contoh diatas, daripada menaip dua fungsi untuk setiap pembolehubah kita hanya perlu untuk menaip satu fungsi statik yang agak kompleks, dan hanya memanggil fungsi ini untuk setiap pembolehubah yang mahu kita berikan fungsi. Malahan fungsi buat_fungsi_untuk_pembolehubah yang kita buat diatas ini telahpun wujud dengan nama “attr_accessor”, walaupun ia tidak menggunakan perkataan “ubah_” dan “ambil_”.

Gabungan antara kebolehan fungsi untuk menerima blok serta kebolehan untuk memanggil fungsi statik semasa definisi kelas menjadi Ruby satu bahasa pengatucaraan yang unik berbanding bahasa pengatucaraan yang lain. Bukannya struktur pengatucaraan seperti ini tidak boleh digunakan dalam Python ataupun Javascript, tetapi Ruby mengimplimentasi fungsi ini dengan sintaks yang sangat bersih tanpa simbol ‘{‘,’}’ atau kata kunci ‘function’ yang seperti mencemarkan kod.

Berbeza dengan Python, nama file tidak mempunyai kaitan dengan nama modul. Satu file boleh mengandungi beberapa modul termasuk sub-modul. Setiap modul boleh mengandungi beberapa kelas serta fungsi. Berbeza dengan Python, Ruby mempunyai satu skop global untuk setiap proses Ruby. Apa yang terkandung dalam skop ini bergantung kepada apa yang telah didefinasikan terlebih dahulu, dan mungkin dalam file yang lain. Ruby menggunakan kata kunci ‘require’ untuk menjalankan satu file. Namun, satu file tidak perlu untuk menggunakan kata kunci ‘require’ jika terdapat file yang lain yang telah me-‘require’ file yang file tersebut perlukan. Ini bermakna, pengatucara tidak dapat mengetahui dengan jelas apa yang boleh digunakan dengan hanya melihat satu file. Mungkin file itu digunakan oleh file yang lain yang telah menggunakan file yang lain terlebih dahulu. Sifat yang tidak mementingkan penerangan tentang bagaimana sesuatu program ini berfungsi berbanding kekemasan kod merupakan antara kelemahan Ruby atau kelebihan Ruby, bergantung kepada pendapat pengatucara. Apa yang pasti jika anda mempunyai pepijat dalam program Ruby, kemungkinan anda akan menghadapi masalah yang besar dalam mencari pepijat tersebut.

Walaupun Ruby secara asalnya dicipta untuk pengatucaraan am, namun pada pendapat saya, populariti Ruby meningkat kerana rangka kerja applikasi laman sesawang yang dipanggil ‘Ruby on Rails’. Ruby on Rails adalah rangka kerja applikasi laman sesawang yang popular serta makin meningkat naik popularitinya. Ruby on Rails, mempunyai struktur MVC, penjana, ORM, migrasi pangkalan data, rangka kerja asset, ujian serta pelbagai fungsi lagi. Bagi saya, Ruby on Rails adalah rangka kerja applikasi laman sesawang yang terbaik yang ada di pasaran jika anda inginkan rangka kerja yang mempunyai banyak fungsi sudah siap terbina. Jika fungsi yang anda cari tidak terbina dalam Ruby on Rails, kemungkinan besar fungsi itu sudah terbina dalam bentuk ‘gem’ yang sudah direka untuk digabungkan dengan Ruby on Rails. Selain Ruby on Rails terdapat juga rangka kerja yang lain untuk Ruby seperti Sinatra. Berbeza dengan Ruby on Rails, Sinatra adalah rangka kerja laman sesawang yang jauh lebih ringkas, sesuai untuk mereka yang inginkan kawalan penuh.

Seperti Python dengan WSGI, Ruby juga mempunyai protokol yang tersendiri sebagai alternatif kepada CGI yang dipanggil Rack. Rack mempunyai fungsi seperti WSGI yakni kebolehan untuk satu proses untuk mengendali beberapa permintaan pada waktu yang sama dengan menggunakan satu proses. Disebabkan itu juga, seperti Python, laman sesawang berasaskan Ruby on Rails agak susah untuk dilancarkan kerana kurangnya hosting laman sesawang yang menyokong protokol ini. Jika anda menggunakan hosting perkongsian, kemungkinan besar anda tidak dapat untuk menggunakan laman sesawang berasaskan Ruby. Disebabkan itu, alternatif yang sedia ada adalah untuk menggunakan VPS. Namun begitu VPS perlukan kemahiran untuk digunakan dan diselenggara. Tambahan lagi, VPS secara amnya lebih mahal berbanding hosting perkongsian. Selain VPS, terdapat juga pelbagai servis ‘platform sebagai servis’ yang memang direka khas untuk melancarkan laman sesawang yang kurang sesuai digunakan dengan hosting perkongsian. Heroku dan Engineyard adalah antara pembekal perkhidmatan tersebut yang paling popular.

PHP

Diantara ketiga-tiga bahasa pengatucara ini, tidak dinafikan bahawa PHP adalah bahasa pengatucaraan yang paling popular dalam konteks pengatucaraan laman sesawang. Menariknya, PHP secara asalnya tidak direka untuk pengatucaraan am. PHP direka khas untuk memproses teks. Maksud PHP itu sendiri adalah ‘PHP Hypertext Preprocessor’ yang bermaksud ‘pem-praproses hypertext (HTML) PHP’. PHP secara asalnya tidak mempunyai banyak fungsi. Malahan PHP hanya menambah sokongan kelas pada versi 4.0 dan ruangan nama(namespace) pada versi 5.3. Walaupun begitu, laman sesawang pada zaman dahulu tidaklah begitu kompleks. Jadi ia tidaklah menjadi isu yang besar. Ditambah lagi, agak mudah untuk menghasilkan dan menyediakan laman sesawang ringkas berasaskan PHP disebabkan strukturnya direka untuk memproses teks serta cara menyediakan skrip yang semudah copy-and-paste serta disokong oleh hampir kesemua pembekal hosting perkongsian. Disebabkan itu, tidak hairanlah jika penggunaan PHP sangat meluas pada zaman ini.

Dalam pembangunan laman sesawang, Python dan Ruby sering kali menggunakan template untuk menjana HTML. Untuk PHP, file PHP itu sendiri adalah template. Pentafsir PHP akan mengoutput apa sahaja teks yang berada dalam skrip ‘.php’, kecuali yang berada diantara perkataan ‘<?php’ dan ‘?>’, yang mana diantara kedua-duanya perkataan itu adalah kod PHP. Perkataan ‘?>’ tidak wajib jika akhir file tersebut adalah kod PHP. Malahan lebih baik jika anda tidak meletakkan ‘?>’ pada hujung file jika file tersebut hanya mengandungi skrip PHP.

Sintaks PHP mempunyai banyak persamaan dengan C++, Javascript dan pengatucaraan shell. Blok kod dimulakan dan diakhiri dengan symbol ‘{‘ dan ‘}’. Fungsi diishtiharkan menggunakan kata kunci ‘function’ seperti Javascript. Setiap kenyataan perlu diakhiri dengan simbol ‘;’. Seperti salah satu sintaks C++, untuk mengakses pembolehubah ahli, PHP menggunakan simbol ‘->’ berbanding ‘.’ , seperti kebanyakan bahasa pengatucaraan yang lain. Berbeza dengan kebanyakan bahasa pengatucaraan yang lain, setiap pembolehubah perlu dimulakan dengan simbol ‘$’.

[php]
Adakah 20 lebih daripada 10?
&amp;lt;?php

function nombor(){
return 20;
}

$pembolehubah = nombor();

if($pembolehubah &amp;lt; 10){
?&amp;gt;
Nampaknya Ya!
&amp;lt;?php
}else{
echo ‘Tidak’;
}
?&amp;gt;
Ini adalah penghujung file.
&amp;lt;?php
# Akan menghasilkan:
# "Adakah 20 lebih daripada 10?"
# "Nampaknya Ya!"
# "Ini adalah penghujung file."
[/php]

PHP mempunyai pelbagai fungsi yang menarik dan kadang-kadang pelik. Walaubagaimanapun, perlu saya sebut disini bahawa PHP telah berkembang dengan sangat pesat dan banyak fungsi telah ditambah pada versi PHP yang baharu. Senang cakap, versi PHP 5.4 adalah versi minimum yang anda patut mulakan. Jika anda bermula dengan versi yang lebih rendah, jangan hairan jika terdapat perkara-perkara yang pelik.

[php]
&amp;lt;?php

function kembalikan_senarai(){
return array("Satu","Dua","Tiga");
}
$nombor_dua = kembalikan_senarai()[1]; # Masalah sintaks untuk PHP 5.3 dan kebawah.

$senarai_baru = ["Satu","Dua","Tiga"]; # Sintaks baru hanya untuk PHP 5.4 dan keatas
$senarai_juga = [0=&amp;gt;"Satu",1=&amp;gt;"Dua",120=&amp;gt;"Sesuatu", "Sesuatu"=&amp;gt;"Sesuatu yang lain"]; # Hashtable/Dictionary dan senarai adalah sama dalam PHP

[/php]

PHP mempunyai sintaks dan sifat yang berbeza dengan kebanyakan bahasa yang lain. Operasi penyamaan PHP agak longgar berbanding bahasa pengatucaraan yang lain. 1 == ‘1’ dianggap betul. Terdapat juga operasi ‘===’ untuk penyamaan yang lebih ketat. PHP menggunakan symbol ‘->’ untuk mengakses ahli kepada objek. Simbol ‘.’ pula digunakan untuk menyambung perkataan. Manakala simbol ‘+’ sentiasa digunakan untuk penyiraan arithmetik. Ini bermakna ‘1’+’2′ === 3 .  Pengatucara juga boleh mengakses ahli objek secara dinamik dengan menggunakan pembolehubah yang mengandungi nama ahli yang ingin diakses, kemudian memanggilnya dengan syntak seperti contoh dibawah.

Seperti Python, untuk mengishtiharkan pembolehubah ahli baru kepada objek, pengatucara boleh terus mengishtiharkan pembolehubah tersebut kepada objek dimana-mana sahaja walaupun diluar definisi kelas. Seperti Python juga, walaupun dalam kelas, untuk mengakses pembolehubah ahli pengatucara perlu menggunakan pembolehubah $this untuk mengakses objek kelas. PHP menggunakan pewarisan tunggal seperti JAVA. Seperti bahasa pengatucaraan pentafsiran yang lain, PHP menyokong penggunaan Duck Typing. Berbeza dengan bahasa pengatucaraan pentafsiran yang lain, PHP juga menyokong penggunaan interface. Tambahan lagi PHP membolehkan pengatucara untuk menyertakan jenis pembolehubah dalam parameter fungsi seperti bahasa pengatucaraan statik. PHP juga menyokong penggunaan pengubah akses. Seperti Ruby, PHP mempunyai satu skop global. Nama file tidak mempunyai kaitan dengan nama modul atau kelas. Ini juga bermakna, proses menyahpepijat skrip PHP boleh menjadi agak sukar.

[php]
&amp;lt;?php

class KelasSatu{
public $nilai = 123;
public function bagiSatu(){
return 1;
}
public function bagiNilai(){
return $this-&amp;gt;nilai;
}
}

$satu = new KelasSatu();

echo ‘Apa dia bagi?’;
echo ‘Dia bagi ‘.$satu-&amp;gt;bagiSatu();
$satu-&amp;gt;nilai = ‘Nilai Lain’;
$nak_panggil = ‘bagiNilai’;
echo ‘Nilai pula ‘.$satu-&amp;gt;$nak_panggil();

# Akan menghasilkan
# ‘Apa dia bagi?’
# ‘Dia bagi 1’
# ‘Nilai pula Nilai Lain’
[/php]

PHP 5.4 turut menyertakan kebolehan traits, yakni mixin seperti Ruby. Bermula pada versi PHP 5.3, PHP juga boleh menggunakan fungsi anonymous yang membolehkan fungsi untuk disimpan kedalam pembolehubah, membolehkan corak pengatucaraan seperti Javascript.

[php]

class Manusia{
function adakah_orang(){
return true;
}
}

traits KebolehanMemasak{
function masak(){
echo "sedang memasak";
}
}

traits KebolehanMelukis{
function lukis(){
echo "sedang melukis";
}
}

class OrangA extends Manusia{
use KebolehanMemasak;
use KebolehanMelukis;

function siapa_kamu(){
echo "saya orang A. Saya boleh memasak dan melukis.";
}
}

$oranga = new OrangA();
if($oranga.adakah_orang()){
echo "Memang orang";
}
$oranga.siapa_kamu();
$oranga.masak();
$oranga.lukis();

# Akan print
# "Memang orang"
# "saya orang A. Saya boleh memasak dan melukis."
# "sedang memasak"
# "sedang melukis"

$tambah_dua = function($nombor){
return $nombor+2;
}

function untuk_setiap_benda_hasilkan($senarai,$buat_sesuatu){
$senarai_baru = [];
foreach($senarai as $benda){
$senarai_baru[] = $buat_sesuatu($benda);
}
return $senarai_baru;
}

$hasil = untuk_setiap_benda_hasilkan([2,4,5,6],$tambah_dua);

foreach($hasil as $n){
echo $n;
}

# Akan menghasilkan
# "4678"

[/php]

Dari sudut pengatucaraan laman sesawang, PHP masih menggunakan CGI sebagai protokolnya. Ini bermakna setiap permintaan HTTP akan menghasilkan proses PHP yang baru. Perkara ini sebenarnya bergantung kepada implimentasi pelayan, namun struktur applikasi PHP direka dengan anggapan bahawa ia akan menggunakan CGI. Berbeza dengan Python dan Ruby, sangat mudah untuk kita menghasilkan skrip lama sesawang ringkas menggunakan PHP. Setiap querystring serta parameter HTTP boleh diakses secara global menggunakan pembolehubah $_POST atau $_GET. Pengatucara juga tidak perlu untuk menyediakan template berasingan kerana file PHP itu sendiri adalah template. Kemudian, pengatucara hanya perlu menyalin file tersebut kedalam folder di web server. Dan file tersebut sudah sedia untuk digunakan dari browser tanpa perlu memulakan semula pelayan.

Namun, apabila laman sesawang menjadi lebih kompleks, lebih banyak kod diperlukan untuk mengimplimentasi pelbagai logik-logik berbanding manipulasi HTML. Akibatnya, struktur php yang seakan-akan template menjadi kurang penting berbanding fungsi-fungsi pengatucaraan yang disediakan. Tambahan lagi, terdapat laman sesawang moden yang menjadikan pelayan hanya sebagai pelayan API yang bermakna pelayan tidak perlu risau tentang HTML langsung. Segala maklumat dari pelayar diperoleh menggunakan AJAX. Dalam situasi inilah PHP yang secara asalnya dikhaskan untuk memproses HTML mempunyai kekurangan. Penggunaan simbol-simbol seperti ‘->’ dan ‘$’ mengakibatkan kod PHP kelihatan kurang kemas berbanding bahasa lain. Tambahan lagi pelbagai simbol seperti ‘.’ mempunyai peranan yang berbeza berbanding bahasa lain. Situasi ini sedikit sebanyak mengukarkan penggunaan PHP sebagai bahasa pengatucaraan am. Disebabkan PHP masih menggunakan protokol CGI, pelbagai teknik pengatucaraan yang bijak perlu digunakan. Pengatucara tidak boleh menyertakan file luaran sewenang-wenangnya kerana file itu perlu dijalankan semula untuk setiap permintaan. Disebabkan ini, pelbagai teknik autoload telah dicipta. Rangka kerja laman sesawang PHP direka supaya hanya file yang diperlukan sahaja dijalankan.

Walaubagaimanapun jangan pandang rendah terhadap laman sesawang berasaskan PHP. Pengatucaraan PHP yang moden telah berkembang dengan pesat dengan terbangunnya peralatan-peralatan seperti Composer serta penambahan fungsi kedalam PHP setiap kali PHP versi baru muncul. Ditambah lagi, PHP mempunyai banyak rangka kerja laman sesawang seperti CodeIgniter, Laravel, Symphony, CakePHP dan macam-macam lagi. Disebabkan usia dan pengalaman PHP dalam pengatucaraan laman sesawang, tidak hairanlah jika php mempunyai banyak rangka kerja. Malahan tidaklah begitu aneh jika sesuatu laman sesawang PHP menggunakan rangka kerjanya yang tersendiri. CodeIgniter boleh dikatakan rangka kerja PHP yang paling ringkas dan mudah dipelajari. Namun, pada pendapat saya, CodeIgniter bukanlah pilihan yang baik kerana ia sudah terlalu lama tidak diselenggara serta tidak menggunakan kelebihan PHP versi baru. Laravel pula adalah rangka kerja laman sesawang PHP yang agak baru namun makin mendapat sambutan. Saya pernah terbaca bahawa Laravel adalah Ruby on Rails untuk PHP dan saya bersetuju dengan pendapat tersebut. Struktur Laravel mempunyai banyak persamaan dengan Ruby on Rails. Laravel menggunakan struktur MVC seperti kebanyakan rangka kerja laman sesawang yang lain. Laravel mempunyai penjana, ORM, migrasi pangkalan data seperti juga Ruby on Rails.

Saya secara peribadi tidak menggemari PHP kerana sintaknya yang agak pelik dan kurang kemas dengan pelbagai simbol yang seakan-akan mencemari kod. Namun begitu dalam konteks pengatucaraan laman sesawang, PHP mempunyai kelebihan ketara berbanding Ruby dan Python yakni sokongan pembekal hosting perkongsian. Ini adalah kerana sifat PHP yang sangat mudah untuk dipasang. Disebabkan ini, banyak applikasi laman sesawang dicipta menggunakan PHP. Applikasi ini sering kali dikategorikan sebagai sistem pengurusan isi kandungan (CMS). Contohnya WordPress, Joomla, Drupal, Magento dan pelbagai lagi. Kewujudan applikasi seperti ini membolehkan sesiapa pun untuk memiliki laman sesawang yang dinamik tanpa perlu belajar mengatucara laman sesawang. Sistem-sistem ini turut memiliki sistem plugin yang membolehkan pengguna untuk menambah fungsi sistem menggunakan plugin yang sedia ada. Walaubagaimanapun, sistem pengurusan isi kandungan agak sukar untuk di sesuaikan berbanding laman sesawang yang dibina dari awal.

Kesimpulannya

Pada pendapat saya, jika saya perlu menghasilkan satu laman sesawang dengan cepat yang tidak boleh dilakukan menggunakan CMS, saya akan menggunakan Ruby on Rails. Namun, jika laman sesawang tersebut lebih kompleks serta perlukan kawalan yang lebih mendalam serta tidak sesuai dengan Ruby on Rails, saya akan menggunakan Python, mungkin dengan rangka kerja Pyramid. Jika saya ingin membangunkan laman sesawang yang mana laman sesawang tersebut perlu menggunakan hosting perkongsian atau laman sesawang itu perlu disebarkan di sebanyak pelayan yang mungkin, saya pilih PHP serta Laravel. 

This entry was posted in Article, Programming, Projects. Bookmark the permalink.
  • Satu perkongsian yang cukup menarik bro.

    Btw, ada typo:

    mengukarkan
    mengertakan
    pembulehubah
    penyiraan
    skrip lama sesawang
    Pengatucara