Powered By Blogger

Minggu, 03 Juli 2011

MENGENAL BATIK

I. SEKILAS TENTANG PERJALANAN SEJARAH BATIK JOGJAKARTA
II. NAMA-NAMA MOTIF BATIK TEMPO DULU
III. PERLENGKAPAN PROSES BATIK CANTING
IV. PERLENGKAPAN PROSES BATIK CAP & PROSES BATIK CAP
V. PEMAKAIAN KAIN BATIK
VI. CARA PEMAKAIAN KAIN BATIK
VII. PERAWATAN KAIN BATIK



I. SEKILAS TENTANG PERJALANAN SEJARAH BATIK JOGJAKARTA



Seni Batik Tradisional dikenal sejak beberapa abad yang lalu di tanah Jawa. Bila kita menelusuri perjalan perkembangan batik di tanah Jawa tidak akan lepas dari perkembangan seni batik di Jawa Tengah. Batik Jogja merupakan bagian dari perkembangan sejarah batik di Jawa Tengah yang telah mengalami perpaduan beberapa corak dari daerah lain.
Perjalanan “Batik Yogya” tidak bisa lepas dari perjanjian Giyanti 1755. Begitu Mataram terbelah dua, dan Kraton Ngayogyakarta Hadiningrat berdiri, busana Mataram diangkut dari Surakarta ke Ngayogyakarta maka Sri Susuhunan Pakubuwono II merancang busana baru dan pakaian adat Kraton Surakarta berbeda dengan busana Yogya.
Di desa Giyanti, perundingan itu berlangsung. Yang hasilnya antara lain , Daerah atau Wilayah Mataram dibagi dua, satu bagian dibawah kekuasaan Sri Paduka Susuhunan PB II di Surakarta Hadiningrat , sebagian lagi dibawah kekuasaan Kanjeng Pangeran Mangkubumi yang setelah dinobatkan sebagai raja bergelar Ngersa Dalem Sampeyan Dalem Ingkang Sinuhun Kangjeng Sultan Hamengku Buwana Senopati ing Ngalaga Ngabdul Rachman Sayidin Panatagama Kalifatullah ingkang jumeneng kaping I , yang kemudian kratonnya dinamakan Ngayogyakarta Hadiningrat.
Semua pusaka dan benda-benda keraton juga dibagi dua. Busana Mataraman dibawa ke Yogyakarta , karena Kangjeng Pangeran Mangkubumi yang berkehendak melestarikannya. Oleh karena itu Surakarta dibawah kekuasaan Sri Paduka Susuhunan PB III merancang tata busana baru dan berhasil membuat Busana Adat Keraton Surakarta seperti yang kita lihat sampai sekarang ini.

Ciri khas batik gaya Yogyakarta , ada dua macam latar atau warna dasar kain. Putih dan Hitam. Sementara warna batik bisa putih (warna kain mori) , biru tua kehitaman dan coklat soga. Sered atau pinggiran kain, putih, diusahakan tidak sampai pecah sehingga kemasukan soga, baik kain berlatar hitam maupun putih. Ragam hiasnya pertama Geometris : garis miring lerek atau lereng , garis silang atau ceplok dan kawung , serta anyaman dan limaran.Ragam hias yang bersifat kedua non-geometris semen , lung- lungan dan boketan.Ragam hias yang bersifat simbolis erat hubungannya dengan falsafah Hindu – Jawa ( Ny.Nian S Jumena ) antara lain :
Sawat Melambangkan mahkota atau penguasa tinggi , Meru melambangkan gunung atau tanah ( bumi ) , Naga melambangkan air , Burung melambangkan angin atau dunia atas , Lidah api melambangkan nyala atau geni.
Sejak pertama sudah ada kain larangan. Setiap Sultan yang bertahta berhak membuat peraturan baru atau larangan-larangan.

Terakhir, Sri Paduka Sultan HB VIII membuat peraturan baru ( revisi ) berjudul Pranatan dalem bab namanipun peangangge keprabon ing Nagari Ngayogyakarta Hadiningrat, yang dimuat dalam Rijksblad van Djokjakarta No 19. th 1927, Yang dimaksud pangangge keprabon ( busana keprabon ) adalah : kuluk ( wangkidan ), dodot / kampuh serta bebet prajuritan, bebet nyamping ( kain panjang ) , celana sarta glisire ( celana cindhe , beludru , sutra , katun dan gelisirnya ), payung atau songsong.
Motif batik larangan : Parang rusak ( parang rusak barong , parang rusak gendreh < 8 cm , parang rusak klithik < 4 cm), semen ageng sawat grudha ( gurdha ) , semen ageng sawat lar , udan riris , rujak senthe , parang-parangan yang bukan parang rusak, semua ini besar-kecilnya sesuai menurut ukuran parang rusak.
Semua putra dalem diperbolehkan mengenakan kain-kain tersebut di atas. Busana batik untuk Permaisuri diperbolehkan sama dengan raja. Garwa ampeyan dalem diizinkan memakai parang rusak gendreh kebawah. Garwa Padmi KG Pangeran Adipati sama dengan suaminya. Garwa Ampeyan KG Pangeran Adipati diperbolehkan memakai parang rusak gendreh ke bawah. Demikian pula putra KG Pangeran Adipati. Istri para Pangeran Putra dan Pangeran Putra Raja yang terdahulu ( Pangeran Putra Sentananing Panjenengan dalem Nata ) sama dengan suaminya . Garwa Ampeyan para Pangeran diperbolehkan memakai parang rusak gendreh ke bawah.
Wayah dalem ( cucu Raja ) mengenakan parang rusak gendreh ke bawah. Pun Buyut dalem ( cicit Raja) dan Canggah dalem ( Putranya buyut ). Warengipun Panjenengan dalem Nata ( putra dan putri ) kebawah diperbolehkan mengenakan kain batik parang – parangan harus seling , tidak diperbolehkan byur atau polos.
Pepatih dalem ( Patih Raja ) diperkenankan memakai parang rusak barong kebawah.
Abdidalem : Pengulu Hakim , Wedana Ageng Prajurit , Bupati Nayaka Jawi lan lebet diperkenankan mengenakan parang rusak gendreh kebawah.
Bupati Patih Kadipaten dan Bupati Polisi sama dengan abdidalem tersebut diatas.
Penghulu Landrad , Wedana Keparak para Gusti ( Nyai Riya ), Bupati Anom , Riya Bupati Anom , parang rusak gendreh kebawah.
Abdidalem yang pangkatnya dibawah abdi dalem Riya Bupati Anom dan yang bukan pangkat bupati Anom, yakni yang berpangkat Penewu Tua

Selasa, 14 Juni 2011

MIMPI DI WAKTU SMA

Mencapai apa yang anda inginkan, menjadi apa yang anda cita-citakan, mengerjakan apa yang anda impikan - itulah hal yang paling penting bagi anda.
Bila detil-detil kehidupan sehari-hari anda - menghalangi anda mencapai tujuan-tujuan di atas - maka berarti cita-cita anda masih belum cukup besar. Untuk mencapai cita-cita - anda harus membuat cita-cita anda PENTING. Untuk menjadi penting - buatlah cita-cita anda BESAR.

Visualisasikan dalam pikiran anda cita-cita tersebut. Bukan. Bukan di sudut hati - yang hanya anda tilik sekali seminggu - tetapi di PUSAT hati. Letakkan di situ, sehingga hal-hal lain menjadi lebih kecil.
Apa yang tak terhindarkan mata memang harus terjadi, apa yang tak terhindarkan pikiran - memang harus tercapai. Ketimbang membuat hidup sehari-hari anda menghalangi cita-cita anda - bukankah lebih baik membuat pencapaian cita-cita sebagai tujuan hidup sehari-hari…? Ciptakan cita-cita besar dalam pikiran - dan anda akan sampai ke sana. Sampai ke cita-cita itu

Kamis, 26 Mei 2011

SIMO BUDI UTOMO

Simo Budi Utomo adalah sebuah paguyuban mahasiswa pecinta Reog yang ingin melestarikan dan menjaga warisan budaya leluhur tersebut. dengan cara- cara yang telah di ajarkan sebelum kami. Tempat dimana kami bisa belajar tentang semua hal, menambah wawasan kami dalam dunia seni khususnya seni REOG PONOROGO.Kreatifitas sangat di perlukan dalam tempat ini. dan semoga dengan apa yang telah kita pelajari dan kita lakukan selama ini bisa menjadi manfaat dan inspirasi bagi semua kalangan. Maju terus Simo Budi Utomo......."sukses bukan tentang apa yang kita dapat, melainkan proses dari apa dan dari mana kita mendapatkannya"....

Rabu, 25 Mei 2011

have fun





sejarah topeng


SUDAH lama tari Topeng Cirebon mengundang tanda tanya akibat daya pesonanya yang tinggi, tidak saja di Indonesia tetapi juga di luar negeri. Tari Panji, yang merupakan tarian pertama dalam rangkaian Topeng Cirebon, adalah sebuah misterium. Sampai sekarang belum ada koreografer Indonesia yang mampu menciptakan tarian serupa untuk menandinginya. Tarian Panji seolah-olah “tidak menari”. Justru karena tariannya tidak spektakuler, maka ia merupakan sejatinya tarian, yakni perpaduan antara hakiki gerak dan hakiki diam. Bagi mereka yang kurang peka dalam pengalaman seni, tarian ini akan membosankan. Tarian kok tidak banyak gerak? Bukankah hakikat tari itu memang gerak (tubuh)?

Inilah teka-teki Tarian Panji dalam Topeng Cirebon. Bagaimana penduduk desa mampu menciptakan tarian semacam itu? Penduduk desa yang tersebar di sekitar Cirebon hanyalah pewaris dan bukan penciptanya. Penduduk desa ini adalah juga penerus dari para penari Keraton Cirebon yang dahulu memeliharanya. Ketika Raja-raja Cirebon diberi status “pegawai” oleh Gubernur Jenderal Daendels, dan tidak diperkenankan memerintah secara otonom lagi, maka sumber dana untuk memelihara semua kesenian Keraton tidak dimungkinkan lagi. Para abdi dalem Keraton terpaksa dibatasi sampai yang amat diperlukan sesuai dengan “gaji” yang diterima Raja dari Pemerintah Hindia Belanda.

Begitulah penari-penari dan penabuh gamelan Keraton harus mencari sumber hidupnya di rakyat pedesaan. Topeng Cirebon yang semula berpusat di Keraton-keraton, kini tersebar di lingkungan rakyat petani pedesaan. Dan seperti umumnya kesenian rakyat, maka Topeng Cirebon juga dengan cepat mengalami transformasi-transformasi. Proses transformasi itu berakhir dengan keadaannya yang sekarang, yakni berkembangnya berbagai “gaya” Topeng Cirebon, seperti Losari, Selangit, Kreo, Palimanan dan lain-lain.

Untuk merekonstruksi kembali Topeng Cirebon yang baku, diperlukan studi perbandingan seni. Berbagai gaya Topeng Cirebon tadi harus diperbandingkan satu sama lain sehingga tercapai pola dan strukturnya yang mendasarinya. Dengan metode demikian, maka akan kita peroleh bentuk yang mendekati “aslinya”. Namun metode ini tak dapat dilakukan tanpa berbekal dasar filosofi tariannya.

Dari mana filsafat tari Topeng Cirebon itu dapat dipastikan? Tentu saja dari serpihan-serpihan tarian yang sekarang ada dan dipadukan dengan konteks budaya munculnya tarian tersebut. Konteks budaya Topeng Cirebon tentu tidak dapat dikembalikan pada budaya Cirebon sendiri yang sekarang. Untuk itu diperlukan penelusuran historis terhadapnya.

Siapakah Empu pencipta tarian ini? Sampai kiamat pun kita tak akan mengetahuinya, lantaran masyarakat Indonesia lama tidak akrab dengan budaya tulis. Meskipun budaya tulis dikenal di Keraton-keraton Indonesia, tetapi tidak terdapat kebiasaan mencatat pencipta-pencipta kesenian, kecuali dalam beberapa karya sastranya saja.

Di zaman mana?

Kalau pencipta tidak dikenal, sekurang-kurangnya di zaman mana Topeng Cirebon ini telah ada? Kepastian tentang ini tidak ada. Namun ada dugaan bahwa di zaman Raja Majapahit, Hayam Wuruk, tarian ini sudah dikenal. Dalam Negarakertagama dan Pararaton dikisahkan raja ini menari topeng (kedok) yang terbuat dari emas. Hayam Wuruk menarikan topeng emas (atapel, anapuk) di lingkungan kaum perempuan istana Majapahit. Jadi Tari topeng Cirebon ini semula hanya ditarikan para raja dengan penonton perempuan (istri-istri raja, adik-adik perempuan raja, ipar-ipar perempuan raja, ibu mertua raja, ibunda raja).

Dengan demikian dapat diduga bahwa Topeng Cirebon ini sudah populer di zaman Majapahit antara tahun 1300 sampai 1400 tarikh Masehi. Mencari dasar filosofi tarian ini harus dikembalikan pada sistem kepercayaan Hindu-Budha-Jawa zaman Majapahit. Tetapi mengapa sampai di Keraton Cirebon? Setelah jatuhnya kerajaan Majapahit (1525), tarian ini rupanya dihidupkan oleh Sultan-sultan Demak yang mungkin mengagumi tarian ini atau memang dibutuhkan dalam kerangka konsep kekuasaan yang tetap spiritual. Dalam babad dikisahkan bahwa Raden Patah menari Klana di kaki Gunung Lawu di hadapan Raja Majapahit, Brawijaya. Ini justru membuktikan bahwa Topeng Cirebon erat hubungannya dengan konsep kekuasaan Jawa. Bahwa hanya Raja yang berkuasa dapat menarikan topeng ini, ditunjukkan oleh babad, yang berarti kekuasaan atas Jawa telah beralih kepada Raden Patah, dan Raja Majapahit hanya sebagai penonton.

Dari Demak tarian ini terbawa bersama penyebaran pengaruh politik Demak. Demak yang pesisir ini memperluas pengaruh kekuasaan dan Islamisasinya di seluruh daerah pesisir Jawa, yang ke arah barat sampai di Keraton Cirebon dan Keraton Banten. Inilah sebabnya berita-berita Belanda menyebutkan keberadaan tarian in di Istana Banten. Banten dan Cirebon, sedikit banyak membawa kebudayaan Jawa-Demak, terbukti dari penggunaan bahasa Jawa lamanya. Sedangkan Demak sendiri dilanjutkan oleh Pajang yang berada di pedalaman, kemudian digantikan oleh Mataram yang juga di pedalaman.

Topeng Majapahit ini, dengan demikian, hanya hidup di daerah pesisir Jawa Barat, sedangkan di Jawa pedalaman topeng tidak hidup kecuali bentuk dramatik lakon Panjinya. Kalau topeng tetap hidup dalam fungsi ritualnya, tentunya juga berkembang di kerajaan-kerajaan Islam Jawa pedalaman. Rupanya topeng dipelihara di Jawa Barat karena pesona seninya. Topeng sangat puitik dan kurang mengacu pada mitologi Panji yang hinduistik. Topeng lebih dilihat sebagai simbol yang mengacu pada realitas transenden. Inilah sebabnya sultan-sultan di Jawa Barat yang kuat Islamnya masih memelihara kesenian ini.

Topeng Cirebon adalah simbol penciptaan semesta yang berdasarkan sistem kepercayaan Indonesia purba dan Hindu-Budha-Majapahit. Paham kepercayaan asli, di mana pun di Indonesia, dalam hal penciptaan, adalah emanasi. Paham emanasi ini diperkaya dengan kepercayaan Hindu dan Budha. Paham emanasi tidak membedakan Pencipta dan ciptaan, karena ciptaan adalah bagian atau pancaran dari Sang Hyang Tunggal.

Siapakah Sang Hyang Tunggal itu? Dia adalah ketidak-berbedaan. Dalam diriNya adalah ketunggalan mutlak. Sedangkan semesta ini adalah keberbedaan. Semesta itu suatu aneka, keberagaman. Dan keanekan itu terdiri dari pasangan sifat-sifat yang saling bertentangan tetapi saling melengkapi. Pemahaman ini umum di seluruh Indonesia purba, bahkan di Asia Tenggara dan Pasifik. Dan filsuf-filsuf Yunani pra-Sokrates, filsuf-filsuf alam, juga mengenal pemahaman ini. Boleh dikatakan, pandangan bahwa segala sesuatu ini terdiri dari pasangan kembar yang saling bertentangan tetapi merupakan pasangan, adalah universal manusia purba.

Mengandung semua sifat ciptaan

Sang Hyang Tunggal Indonesia purba ini mengandung semua sifat ciptaan. Karena semua sifat yang dikenal manusia itu saling bertentangan, maka dalam diri Sang Hyang Tunggal semua pasangan oposisi kembar tadi hadir dalam keseimbangan yang sempurna. Sifat-sifat positif melebur jadi satu dengan sifat-sifat negatif. Akibatnya semua sifat-sifat yang dikenal manusia berada secara seimbang dalam diriNya sehingga Sifat itu tidak dikenal manusia alias Kosong mutlak. Paradoksnya justru Kosong itu Kepenuhan sejati karena Dia mengandung semua sifat yang ada. Kosong itu Penuh, Penuh itu Kosong, itulah Sang Hyang Tunggal itu. Di dalamNya tiak ada perbedaan, tunggal mutlak. Di Cina purba, Sang Hyang Tunggal ini disebut Tao.

Topeng Cirebon menyimbolkan bagaimana asal mula Sang Hyang Tunggal ini memecahkan diriNya dalam pasangan-pasangan kembar saling bertentangan itu, seperti terang dan gelap, lelaki dan perempuan, daratan dan laut. Dalam tarian ini digambarkan lewat tari Panji, yakni tarian yang pertama. Tarian Panji ini merupakan masterpiece rangkaian lima tarian topeng Cirebon. Tarian Panji justru merupakan klimaks pertunjukan. Itulah peristiwa transformasi Sang Hyang Tunggal menjadi semesta. Dari yang tunggal belah menjadi yang aneka dalam pasangan-pasangan.

Inilah sebabnya kedok Panji tak dapat kita kenali secara pasti apakah itu perwujudan lelaki atau perempuan. Apakah gerak-geriknya lelaki atau perempuan. Kedoknya sama sekali putih bersih tanpa hiasan, itulah Kosong. Gerak-gerak tariannya amat minim, namun iringan gamelannya gemuruh. Itulah wujud paradoks antara gerak dan diam. Tarian Panji sepenuhnya sebuah paradoks. Inilah kegeniusan para empu purba itu, bagaimana menghadirkan Hyang Tunggal dalam transformasinya menjadi aneka, dari ketidakberbedaan menjadi perbedaan-perbedaan. Itulah puncak topeng Cirebon, yang lain hanyalah terjemahan dari proses pembedaan itu.

Empat tarian sisanya adalah perwujudan emanasi dari Hyang Tunggal tadi. Sang Hyang Tunggal membagi diriNya ke dalam dua pasangan yang saling bertentangan, yakni “Pamindo-Rumyang”, dan “Patih-Klana”. Inilah sebabnya kedok “Pamindo-Rumyang” berwarna cerah, sedangkan “Patih-Klana” berwarna gelap (merah tua).

Gerak tari “Pamindo-Rumyang” halus keperempuan-perempuanan, sedangkan Patih-Klana gagah kelaki-lakian. Pamindo-Rumyang menggambarkan pihak “dalam” (istri dan adik ipar Panji) dan Patih-Klana menggambarkan pihak “luar”. Terang dapat berarti siang, gelap dapat berarti malam. Matahari dan bulan. Tetapi harus diingat bahwa semuanya itu adalah Panji sendiri, yang membelah dirinya menjadi dua pasangan saling bertentangan sifat-sifatnya. Inilah sebabnya keempat tarian setelah Panji mengandung unsur-unsur tarian Panji. Untuk hal ini orang-orang tari tentu lebih fasih menjelaskannya.

Topeng Panji menyimbolkan peristiwa besar universal, yakni terciptanya alam semesta beserta manusia ini pada awal mulanya. Topeng Panjing atau topeng Cirebon ini mengulangi peristiwa primordial umat manusia, bagaimana “penciptaan” terjadi. Tidak mengherankan kalau di zaman dahulu hanya ditarikan oleh para raja. Raja mewakili kehadiran Sang Hyang Tunggal itu sendiri, karena dalam paham kekuasaan Jawa, Raja adalah Dewa itu sendiri, yang dikenal dengan paham dewa-Raja.

Topeng Cirebon adalah gambaran sangat puitik tentang hadirnya alam semesta serta umat manusia. Sang Hyang Tunggal yang merupakan ketunggalan mutlak tanpa pembedaan, berubah menjadi keanekaan relatif yang sangat berbeda-beda sifatnya. Tari Panji adalah tarian Sang Hyang Tunggal itu sendiri, dan tarian-tarian lainnya yang empat adalah perwujudan dari emanasi diriNya menjadi pasangan-pasangan sifat yang saling bertentangan.

Topeng Cirebon adalah tarian ritual yang amat sakral. Tarian ini sama sekali bukan tontonan hiburan. Itulah sebabnya dalam kitab-kitab lama disebutkan, bahwa raja menarikan Panji dalam ruang terbatas yang disaksikan saudara-saudara perempuannya. Untuk menarikan topeng ini diperlukan laku puasa, pantang, semedi, yang sampai sekarang ini masih dipatuhi oleh para dalang topeng di daerah Cirebon.

Tarian juga harus didahului oleh persediaan sajian. Dan sajian itu bukan persembahan makanan untuk Sang Hyang Tunggal. Sajian adalah lambang-lambang dualisme dan pengesaan. Inilah sebabnya dalam sajian sering dijumpai bedak, sisir, cermin yang merupakan lambang perempuan, didampingi oleh cerutu atau rokok sebagai lambang lelaki. Bubur merah lambang dunia manusia, bubur putih lambang Dunia Atas. Cowek batu yang kasar sebagai lambang lelaki, dan uleg dari kayu yang halus sebagai lambang perempuan. Pisang lambang lelaki, buah jambu lambang perempuan. Air kopi lambang Dunia Bawah, air putih lambang Dunia Atas, air teh lambang Dunia Tengah. Sesajian adalah lambang keanekaan yang ditunggalkan.

Dari: Pikiran Rakyat, Rabu, 25 Mei 2011

Minggu, 26 Desember 2010


Reog adalah salah satu kesenian budaya yang berasal dari Jawa Timur, khususnya kota Ponorogo. Tak hanya topeng kepala singa saja yang menjadi perangkat wajib kesenian ini. Tapi juga sosok warok dan gemblak yang menjadi bagian dari kesenian Reog.

Di Indonesia, Reog adalah salah satu budaya daerah yang masih sangat kental dengan hal-hal yang berbau mistik dan ilmu kebatinan.

Seni Reog Ponorogo ini terdiri dari 2 sampai 3 tarian pembuka. Tarian pertama biasanya dibawakan oleh 6-8 pria gagah berani dengan pakaian serba hitam, dengan muka dipoles warna merah. Para penari ini menggambarkan sosok singa yang pemberani.

Berikutnya adalah tarian yang dibawakan oleh 6-8 gadis yang menaiki kuda. Pada reog tradisional, penari ini biasanya diperankan oleh penari laki-laki yang berpakaian wanita. Tarian ini dinamakan tari jaran kepang. Eits, tarian ini berbeda dengan tari kuda lumping. Tarian pembukaan lainnya jika ada biasanya berupa tarian oleh anak kecil yang membawakan adegan lucu.

Setelah tarian pembukaan selesai, baru ditampilkan adegan inti yang isinya bergantung kondisi dimana seni reog ditampilkan. Jika berhubungan dengan pernikahan maka yang ditampilkan adalah adegan percintaan. Untuk hajatan khitanan atau sunatan, biasanya cerita pendekar.

Adegan terakhir adalah singa barong. Seorang penari memakai topeng berbentuk kepala singa dengan mahkota yang terbuat dari bulu burung merak.

Rabu, 14 April 2010

Tugas PBO

Nama : Redi Purnama
Nim : 09530455
Kelas : TI 2A


Enkapsulasi, yang mencegah pengaksesan langsung ke fungsi atau variabel yang ingin dilindungi;

Inheritance, yang memungkinkan pendefinisian kelas baru yang diturunkan dari kelas yang sudah ada;

Polimorfisme, yang memungkinkan pengaksesan ke suatu metode bergantung dari tipe data objek yang diakses. Proses ini disebut juga dengan dynamic binding, yaitu penentuan alamat dari metode atau variabel yang akan diakses dilakukan pada saat run time.



Dari sini jelas bahwa PHP4 belum dapat dikategorikan sebagai bahasa yang mendukung OOP. Persyaratan enkapsulasi tidak dapat sepenuhnya diimplementasikan oleh PHP4, yang pada bahasa C++ atau Java direalisasikan dengan kata kunci private maupun protected. Pada PHP setiap atribut maupun metode masih dapat diakses langsung baik dari dari dalam kelas turunan, dari dalam kelas lainnya, maupun secara global.



Walaupun PHP4 tidak mengenal kata kunci abstract dan virtual seperti pada C++ maupun interface seperti pada Java, namun dukungan polimorfisme di PHP4 sudah diimplementasikan dengan cukup baik.



Faktor kekurangan lain seperti tidak adanya dukungan overloading metode (bukan overriding), tidak mengurangi pengguna PHP untuk menggunakan OOP dalam menulis program Web mereka, karena banyak faktor keuntungan yang dapat diperoleh seperti:

kemudahan dalam mengelola kode OOP;

kemudahan untuk memahami alur program;

dan tidak kalah pentingnya adalah kemudahan penggunaan kode yang sama untuk aplikasi lainnya.

Kelas dan Objek



Dalam konteks PHP, kelas dapat dibayangkan sebagai kumpulan dari variabel dan fungsi yang akan menangani variabel tersebut. Kelas juga dapat dipandang sebagai bentuk proses enkapsulasi, walau tidak sepenuhnya kriteria ini terpenuhi seperti yang telah diutarakan sebelumnya.



Dalam contoh aplikasi nanti, kita akan mengambil tema koneksi ke database MySQL dan PostgreSQL yang direalisasikan dalam bentuk OOP. Kelas MySQLDb dipakai sebagai kelas dasar yang akan digunakan oleh kelas PostgreSQL sebagai kelas turunan. Namun agar lebih mudah dimengerti, pada pembahasan awal kita akan menggunakan kelas sederhana yang tidak berhubungan dengan kedua kelas tadi.



Berikut ini adalah contoh penulisan sebuah kelas A:

class A {

// Pendeklarasian variabel

var $host_1;



// Konstruktor

function A() {

...

}



// Definisi metode MetodeB

function MetodeB($args="") {

...

}

}

Variabel Anggota



Variabel anggota (member variable) dideklarasikan dengan menggunakan kata kunci var diikuti dengan nama variabel. Namun penggunaan variabel anggota ini tanpa pendeklarasian sebelumnya tidak akan menyebabkan kesalahan pada PHP4. Variabel ini hanya boleh diinisialisasi dengan konstanta. Penginisialisasian dengan non-konstanta harus dilakukan di dalam konstruktor. Dalam OOP, terminologi lain untuk variabel anggota adalah properti atau atribut.

// Global variabel

$gHost = "172.20.172.10";



// Class

class A {

// Benar, inisialisasi dengan konstanta

var $host_1="localhost";

// Deklarasi variabel host_2

var $host_2;



// Konstruktor

function A() {

global $gHost;



// Benar, inisialisasi dengan non-konstanta

$this->host_2=$gHost;



// Benar, definisi variabel baru dari class

$this->host_3="192.168.0.0";

}

}

Tentang Metode



Cara mendefinisikan sebuah metode sama seperti pada fungsi. Hanya saja, proses ini harus dilakukan dalam lingkup kelas yang bersangkutan. Metode MetodeB() adalah salah satu metode yang didefinisikan pada kelas A.



Pada PHP4 tidak dikenal istilah overloading metode, yaitu pendefinisian beberapa metode berbeda yang mempunyai nama sama namun memiliki daftar argumen yang berbeda. Dalam PHP4 setiap metode harus memiliki nama berbeda. Walau begitu, PHP4 mengenal terminologi argumen default untuk fungsi atau metode. Di sini jumlah dan tipe data dari argumen yang digunakan pada pemanggilan metode dapat berbeda.

...

class A {

...

// Metode B

function MetodeB($args="") {

...

}

}

...



Metode MetodeB() mempunyai argumen default string kosong jika dipanggil tanpa argumen. Dua kemungkinan untuk memanggil metode ini dengan benar adalah sebagai berikut:

ObjekA = new A;

ObjekA->MetodeB();



atau

ObjekA->MetodeB("localhost");



Pada penulisan program memakai gaya OOP, sangat disarankan untuk tidak mengakses atribut secara langsung, melainkan melalui metode. Di sini umumnya dipakai awalan Set untuk memberikan nilai yang baru sebuah variabel. Sedang untuk mengakses nilai atribut digunakan awalan Get.

function SetHost($host) {

$this->host_1 = $host;

}



function GetHost() {

return $this->host_1;

}



Cara ini berhubungan erat dengan prinsip enkapsulasi, yang pada PHP4 belum didukung sepenuhnya, sehingga secara tidak langsung menghilangkan keuntungan cara penulisan metode seperti di atas, karena tidak ada cara untuk melindungi atribut dari pengaksesan secara langsung.

Konstruktor dan Destruktor



PHP4 juga mengenal konstruktor yang dideklarasikan dengan memakai metode yang memiliki nama sama dengan nama kelas yang mendefinisikannya. Konstruktor ini akan dipanggil pada pembuatan sebuah objek dari kelas yang bersangkutan. Ada sedikit perbedaan antara PHP3 dan PHP4 dalam proses pemanggilan konstruktor—terutama pada kelas turunan—yang akan diterangkan di bagian akhir artikel.



Dalam contoh sebelumnya, metode A() adalah konstruktor dari kelas A. Di sini biasanya dilakukan inisialisasi terhadap variabel dengan nilai non-konstanta.



PHP tidak mengenal destruktor. Jika memang diinginkan, dapat digunakan fungsi PHP register_shutdown_function() yang akan dipanggil jika skrip PHP selesai dikerjakan.

Pembuatan Objek



Untuk dapat menggunakan kelas yang telah didefinisikan, kita perlu membuat instan dari kelas tersebut. Proses ini dapat dilakukan dengan bantuan operator new yang akan menghasilkan sebuah objek dari kelas bersangkutan. Dengan operator ini kita dapat membuat beberapa objek dari kelas yang sama. Karena objek adalah individu kelas, maka objek ini tidak mempunyai ketergantungan terhadap objek yang lain.



Setelah kita mempunyai sebuah objek, maka kita dapat mengakses variabel anggota maupun metode yang dimiliki kelas tersebut dengan bantuan operator ->.

// Pembuatan objek baru

ObjekA = new A;



// Pemanggilan metode MetodeB

ObjekA->MetodeB();

Cara Pengaksesan



Pengaksesan ke metode atau ke variabel di dalam lingkup kelas itu sendiri dilakukan dengan bantuan operator $this->. Sebagai contoh, untuk mengubah variabel $host_1 dalam metode MetodeB(), dapat dilakukan dengan $this->host_1 = "localhost".

Inheritance dengan extends



Seperti telah disinggung sebelumnya, inheritance adalah proses pembuatan sebuah kelas yang diturunkan dari kelas lain yang sudah didefinisikan sebelumnya. Salah satu faktor keuntungannya adalah, kita hanya tinggal menambahkan atribut atau metode yang dibutuhkan dalam kelas baru yang akan kita buat. Terminologi kelas yang dijadikan dasar pembuatan kelas baru ini adalah kelas dasar (base class) atau kelas induk (parent class). Sedang kelas yang baru disebut juga kelas turunan (extended class) atau kelas anak (child class).



Pembuatan kelas turunan di PHP4 dapat dilakukan dengan operator extends. Namun harus diingat bahwa dalam PHP4 hanya diperbolehkan menggunakan satu kelas dasar. Penurunan dari beberapa kelas (multiple inheritance) tidak diperbolehkan.



Hal yang juga penting di sini adalah pemanggilan konstruktor kelas turunan. Pada PHP4, jika konstruktor kelas turunan tidak didefinisikan, maka otomatis konstruktor kelas dasar yang akan dipanggil, jika ada. Sedangkan pada PHP3, jika konstruktor kelas turunan tidak ada, konstruktor kelas dasar tidak akan dipanggil.



Berikut ini ilustrasi cara pembuatan kelas turunan dan pemanggilan konstruktor:

// Kelas dasar

class A {

function A() {

echo "Konstruktor class A.
\n";

}

}



// Kelas turunan

class B extends A {

}



$ObjekB = new B;



Kelas B yang tidak mempunyai konstruktor diturunkan dari kelas A yang mempunyai konstruktor. Seperti diharapkan, pada pembuatan objek dari kelas B, maka konstruktor kelas A akan dipanggil. Program di atas akan menampilkan keluaran:

Konstruktor kelas A.



Dalam manual PHP4 dikatakan, jika kelas turunan tidak mempunyai konstruktor, maka konstruktor dari kelas dasar, yaitu metode yang mempunyai nama sama dengan nama kelas dasar, akan dipanggil. Namun pada PHP versi 4.0.4 maupun 4.0.5 hal ini belum dilakukan. Kita akan melihat kasus berikut.



Sekarang jika kita menambahkan sebuah metode di kelas A dengan nama B() (sengaja namanya sama dengan nama kelas B), dan kita jalankan lagi program di atas, maka yang keluar tidak seperti yang kita harapkan.

class A {

...

// Metode tambahan

function B() {

echo "Metode normal B.
\n";

}

}



Tampilan yang dikeluarkan adalah seperti berikut:

Metode normal B.



Di sini tiba-tiba metode B() di kelas A menjadi konstruktor dari kelas B yang akan dipanggil secara otomatis pada setiap pembuatan objek baru dari kelas A. Hal ini seharusnya hanya ditemui pada PHP3, dan tidak pada PHP4 seperti informasi di manual. Kemungkinan besar versi yang sekarang ada masih mengandung kesalahan.



Kelas turunan dapat melakukan overriding metode dari kelas dasar. Jika metode di kelas dasar yang sudah dioverride ini hendak dipanggil dari kelas turunan, maka dapat digunakan operator ::. Operator ini juga dapat dipakai dari lingkup global untuk memanggil metode dari suatu kelas tanpa membuat objek terlebih dahulu.

class A {

function hallo() {

echo "Metode hallo dari class A.
\n";

}

}



class B extends A {

// Override metode hallo dari class A

function hallo() {

echo "Metode hallo dari class B.
\n";

// Memanggil metode hallo di class A

A::hallo(); // Atau dapat juga parent::hallo()

}

}



// Memanggil metode tanpa objek

A::hallo();



$ObjekB = new B;

$ObjekB->hallo();



Program di atas akan menampilkan keluaran seperti berikut:

Metode hallo dari class A.

Metode hallo dari class B.

Metode hallo dari class A.



Untuk mengakses variabel anggota atau metode di kelas dasar tanpa harus tahu nama kelasnya, dapat digunakan kata kunci parent. Pada contoh di atas, jika baris A::hallo() diganti dengan parent::hallo() maka hasilnya akan identik.

Polimorfisme



Seperti dituliskan sebelumnya, polimorfisme adalah cara yang memungkinkan pengaksesan ke suatu metode bergantung dari tipe data objek yang diakses, termasuk dari metode di kelas dasar. Untuk memperjelasnya, mari kita lihat contoh berikut. Di sini kita akan membuat satu kelas dasar, Bangun2D dan dua kelas turunan, Lingkaran dan PersegiPanjang.

class Bangun2D {

function Luas() {}

function Keliling() {}

function Info() {

echo "Luas = ", $this->Luas(), ", Keliling = ", $this->Keliling();

echo “
\n";

}

}



class Lingkaran extends Bangun2D {

var $r;

function Lingkaran($r) { $this->r = $r; }

function Luas() { return pi()*$this->r*$this->r; }

function Keliling() { return 2*pi()*$this->r; }

}



class PersegiPanjang extends Bangun2D {

var $p;

var $l;

function PersegiPanjang($p, $l) { $this->p = $p; $this->l = $l; }

function Luas() { return $this->p*$this->l; }

function Keliling() { return 2*($this->p+$this->l); }

}



$bangun[] = new Lingkaran(10);

$bangun[] = new PersegiPanjang(6, 8);



foreach ($bangun as $b) {

$b->Info();

}



Program di atas akan menampilkan keluaran seperti berikut:

Luas = 314.15926535898, Keliling = 62.831853071796

Luas = 48, Keliling = 28



Dari contoh ini dapat dilihat, metode Info() kelas dasar Bangun2D tidak perlu mengetahui di kelas turunan mana ia sedang berada untuk mengetahui bagaimana cara menghitung luas dan keliling bangun. Jika metode ini dipanggil dari sebuah objek persegipanjang, maka Luas() dan Keliling() dari kelas Persegipanjang yang akan dipanggil; jika objek sebuah lingkaran, maka luas dan keliling lingkaran yang dihitung. Keuntungannya, jika suatu saat kita menambah bangun khusus lain, katakanlah Segitiga atau Poligon, maka metode Info() kelas Bangun2D tidak perlu diubah. Dengan kata lain, metode Info() menjadi reusable. Atau, bisa dikatakan juga bahwa OO dan polimorfisme mengizinkan kode lama (kelas Bangun2D) dapat memanggil kode baru (kelas Segitiga atau Poligon di masa depan).

Kelas MySQLDb dan PostgreSQLDb



Setelah kita belajar teori Pemrograman Berorientasi Objek dengan PHP, maka kita akan melihat penggunaannya dalam aplikasi yang nyata. Dalam CD majalah Anda akan menemukan file oop_php.tgz. Di dalamnya berisi antara lain file mysql.class.php yang mengimplementasikan kelas MySQLDb dan psql.class.php yang mengimplementasikan kelas PostgreSQLDb.



Kelas MySQLDb adalah kelas dasar yang mempunyai metode untuk melakukan operasi ke server database MySQL dengan instruksi sesederhana mungkin dalam pekerjaan yang kompleks. Sebuah objek dari kelas ini dapat melakukan operasi berulang kali, tanpa kehilangan informasi atau data dari operasi sebelumnya. Hal ini sangat bermanfaat terutama ketika melakukan query select.



Kelas PostgreSQLDb sebagai kelas turunan mempunyai fitur yang sama dengan kelas induknya MySQLDb.



Hubungan antara kedua kelas dalam contoh kita kali ini barangkali bukan teladan model abstraksi yang optimal. Dalam aplikasi abstraksi database yang lebih umum, biasanya dibuat satu kelas dasar abstrak yang mendefinisikan interface yang seragam, lalu dibuat kelas-kelas turunan sebagai driver untuk masing-masing jenis database. Jadi biasanya kelas MySQL dan PostgreSQL letaknya sederajat satu sama lain, di bawah satu kelas induk. Contohnya adalah di Perl dengan DBI sebagai kelas induk dan DBD::mysql serta DBD::Pg sebagai kelas-kelas driver. Namun demi kesederhanaan contoh, kita hanya akan membuat dua kelas seperti telah disebutkan sebelumnya.

Konstruktor MySQLDb



Kebanyakan aplikasi PHP mempunyai sebuah file konfigurasi yang berisikan banyak variabel global yang dibutuhkan oleh file lainnya. Pengguna aplikasi biasanya cukup mengedit file ini untuk menyesuaikan aplikasi di sistem yang ada.



Demikian juga kelas MySQLDb dapat dikonfigurasi baik lewat daftar argumen maupun lewat variabel global di mana daftar argumen mempunyai prioritas lebih tinggi. Proses konfigurasi ini dilakukan oleh konstruktor.

class MySQLDb {

...

function MySQLDb($args="") {

global $cfgDBHost, $cfgDBPort, $cfgDBUser, $cfgDBPasswd;



$this->dbh = false;



if (isset($args["host"]))

$this->host=$args["host"];

else

$this->host=$cfgDBHost;



if (isset($args["port"]))

$this->port=$args["port"];

else

$this->port=$cfgDBPort;



if (isset($args["user"]))

$this->user=$args["user"];

else

$this->user=$cfgDBUser;



if (isset($args["passwd"]))

$this->passwd=$args["passwd"];

else

$this->passwd=$cfgDBPasswd;



$this->rownr=0;

}

Metode Select()



Sebagian besar operasi ke database adalah query select. Metode Select() dalam kelas MySQLDb yang menangani operasi ini diimplementasikan sedemikian rupa, sehingga hasilnya disimpan dalam sebuah array yang sekaligus digunakan sebagai nilai kembali oleh metode ini. Dengan demikian data hasil query dapat diakses langsung tanpa harus melewati objek lagi.

function Select($string) {

$this->rowcount=0;

$result = mysql_query($string, $this->dbh);

$this->error=mysql_error();

if (empty($this->error)){

$entry = array();

$this->rowcount=mysql_num_rows($result);

$i=0;

while($row=mysql_fetch_array($result)){

$entry[$i] = $row;

$i++;

}

mysql_free_result($result);

}

return $entry;

}

Kelas PostgreSQLDb



Kelas PostgreSQLDb diturunkan dari kelas MySQLDb. Karena proses pengkonfigurasian sama seperti pada MySQL, maka konstruktor kelas ini hanya memanggil konstruktor dari base kelasnya.

class PostgreSQLDb extends MySQLDb {



function PstgreSQLDb($args="") {

parent::MySQLDb($args);

}

...

}



Jika kelas PostgreSQLDb ini tidak diturunkan dari kelas MySQLDb maka kita harus menulis lagi konstruktor yang sama seperti pada konstruktor MySQLDb.



Untuk mengetahui metode lainnya, pembaca dapat melihat langsung source code dari kedua kelas tersebut.

Contoh Aplikasi



Di sini akan diberikan satu aplikasi sederhana yang melakukan query ke database MySQL atau PostgreSQL, dan menampilkan hasilnya ke browser. Variabel yang diperlukan dalam proses koneksi ke server database disimpan dalam file konfigurasi config.inc.php yang akan digunakan oleh konstruktor kelas dasar MySQLDb.



Setelah mengedit variabel global yang harus disesuaikan dengan sistem yang Anda pakai, maka untuk memilih kelas mana yang akan digunakan, pengguna cukup menuliskan nama kelas yang dilewatkan sebagai parameter fungsi page_open() yang diimplementasi dalam file page.inc.php.

// Menggunakan kelas MySQLDb

if (!page_open(array("db" => 1,

"dbkelas" => "MySQLDb",

"page" => $PHP_SELF)))

die;



Jika ingin menggunakan kelas PostgreSQLDb maka Anda tinggal mengganti parameter "dbkelas"=>"MySQLDb" dengan "dbkelas"=>"PostgreSQLDb".



Pembuatan objek dari kelas sendiri akan ditangani oleh fungsi page_open(). Pada PHP hal ini dimungkinkan karena kelas juga dapat disimpan dalam variabel seperti kita lihat di bawah ini:

function page_open($args) {

global $cfgDatabase,$gDb;



// Menggunakan database ?

if (isset($args["db"])){

// Kelas database ada di argumen?

if (isset($args["dbclass"]))

$gDb = new $args["dbclass"];

// Memakai default

else

$gDb = new MySQLDb;



return $gDb->Connect();

}

return true;

}



Variabel global $gDb adalah objek kelas yang namanya tersimpan dalam $args["dbkelas"].



Dalam CD ada dua jenis file yang digunakan sebagai contoh aplikasi, yaitu mysql.php yang menggunakan kelas MySQLDb dan file postgres.php yang menggunakan kelas PostgreSQLDb untuk mengambil entri data dari tabel users. Gambar 1 dan 2 menunjukkan hasil tampilan keduanya.




Enkapsulasi Java

Enkapsulasi adalah suatu cara untuk menyembunyikan informasi detail dari suatu class. Dua hal yang mendasar dalam enkapsulasi yakni :

• Information hiding.

• Interface to access data.

Information hiding

Sebelumnya kita dapat mengakses anggota class baik berupa atribut maupun method secara langsung dengan menggunakan objek yang telah kita buat. Hal ini dikarenakan akses kontrol yang diberikan kepada atribut maupun method yang ada di dalam class tersebut adalah 'public'. Kita dapat menyembunyikan informasi dari suatu class sehingga anggota class tersebut tidak dapat diakses dari luar, caranya adalah hanya dengan memberikan akses kontrol 'private' ketika mendeklarasikan atribut atau method. Proses ini disebut dengan information hiding.

Interface to access data

Jika kita telah melakukan information hiding terhadap suatu atribut pada suatu class, lalu bagaimana cara melakukan perubahan terhadap atribut yang kita sembunyikan tersebut, caranya adalah dengan membuat suatu interface berupa method untuk menginisialisasi atau merubah nilai dari suatu atribut tersebut.



Implementasi UML

Berikut ini kita akan coba untuk lebih memahami penggunaan konsep enkapsulasi dengan mengimplementasikan UML berikut :



UML Vehicle class with no hiding

Vehicle class berisi atribut yang mempunyai modifier public(+), sehingga TestVehicle1 sebagai test program mempunyai akses langsung terhadap atribut pada Vehicle.

Listing program - Vehicle.java

public class Vehicle{

public double load, maxLoad;

public Vehicle (double maxLoad){

maxLoad = maxLoad + load;

}

public double getLoad(){

return load;

}

public double getMaxLoad(){

return maxLoad;

}

}

Listing program - TestVehicle.java

public class TestVehicle{

public static void main(String[] args){

System.out.println("Creating a vehicle with a 10,000kg maximum load.");

Vehicle vehicle = new Vehicle(10000.0);

System.out.println("Add box #1 (500kg)");

vehicle.load = vehicle.load + 500.0;

System.out.println("Add box #2 (250kg)");

vehicle.load = vehicle.load + 250.0;

System.out.println("Add box #3 (5000kg)");

vehicle.load = vehicle.load + 5000.0;

System.out.println("Add box #4 (4000kg)");

vehicle.load = vehicle.load + 4000.0;

System.out.println("Add box #4 (300kg)");

vehicle.load = vehicle.load + 300.0;

System.out.println("Vehicle load is = " +vehicle.getLoad() + "kg");

}

}

Compile Vehicle.java dan TestVehicle.java lalu jalankan TestVehicle.java. Seharusnya akan keluar tampilan sebagai berikut :




Analisa program

Kita lihat bahwa pada output program tersebut kita menginisialisasi batas maximum load 10,000 kg,

Vehicle vehicle = new Vehicle(10000.0);

akan tetapi dengan memberikan akses kontrol / modifier public pada atribut class Vehicle

public double load, maxLoad;

kita dapat mengakses langsung atribut class yang seharusnya perlu diberi pengecekan agar tidak sampai melebihi maxload

vehicle.load = vehicle.load + 500.0;

maka dapat mengakibatkan masalah(trouble) yakni batas maximum load yang kita buat tidak berpengaruh apapun sehingga terdapat penambahan boxes yang melebihi kapasitas(10050.0kg) dikaernakan tidak ada pengecekan kapasitas maksismum.




Vehicle class berisi atribut yang mempunyai modi_er public, sehingga TestVehicle1 sebagai test program mempunyai akses langsung terhadap atribut pada Vehicle.

Listing program - Vehicle.java

public class Vehicle1{

private double load, maxLoad;

public Vehicle1 (double max){

this.maxLoad = max;

}

public double getLoad(){

return this.load;

}

public double getMaxLoad(){

return this.maxLoad;

}

public boolean addBox(double weight){

double temp = 0.0D;

temp = this.load + weight;

if(temp <= maxLoad){

this.load = this.load + weight;

return true;

}

else{

return false;

}

}

}

Listing program - TestVehicle.java

public class TestVehicle1{

public static void main(String[] args){

System.out.println("Creating a vehicle with a 10,000 kg maximum load.");

Vehicle1 vehicle = new Vehicle1(10000);

System.out.println("Add box #1 (500kg) : " + vehicle.addBox(500));

System.out.println("Add box #2 (250kg) : " + vehicle.addBox(250));

System.out.println("Add box #3 (5000kg) : " + vehicle.addBox(5000));

System.out.println("Add box #4 (4000kg) : " + vehicle.addBox(4000));

System.out.println("Add box #5 (300kg) : " + vehicle.addBox(300));

System.out.println("Vehicle load is " +vehicle.getLoad() + "kg");

}

}

Compile Vehicle1.java dan TestVehicle1.java lalu jalankan TestVehicle1.java. Maka akan keluar tampilan sebagai berikut :










Analisa program

Kita lihat bahwa pada output program tersebut pada penambahan box ke-5 terjadi kelebihan kapasitas maksimal sehingga method addBox mengembalikan nilai false, dalam arti bahwa terjadi penolakan terhadap penambahan box ke 5.