Anda di halaman 1dari 24

MODUL

MATAKULIAH

Pemrograman
Berorientasi Objek
CHOERUN ASNAWI, S.KOM.

SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER


(STMIK) JENDERAL ACHMAD YANI
YOGYAKARTA
2012

PENDAHULUAN
A. Pengertian
Pemrograman berorientasi pada objek atau Object-Oriented Programming (OOP)
merupakan suatu paradigma pemrograman yang termasuk ke dalam ketegori pemrograman
imperatif. Pemrograman imperatif sendiri adalah suatu paradigma pemrograman yang
mendeskripsikan program sebagai suatu urutan atau alur langkah-langkah yang harus
dilakukan untuk memecahkan suatu masalah. Berlawanan dari pemrograman imperatif
adalah pemrograman deklaratif, yang mendeskripsikan program sebagai sekumpulan aturan
yang digunakan untuk mendeskripsikan masalah.
Konsep OOP berbeda dari konsep pemrograman prosedural, meskipun sama-sama bersifat
imperatif. Pada pemrograman prosedural, programmer berpikir bagaimana mengolah data
yang ada dengan menggunakan instruksi-instruksi yang ada. Di sini programmer melihat
data sebagai objek PASIF yang harus dikenai tindakan agar dapat menghasilkan output yang
diinginkan. Berbeda dengan itu, pada konsep OOP programmer berpikir bagaimana
membuat sebuah objek yang berisi data dan dapat melakukan pekerjaan yang sesuai. Di sini
programmer melihat data sebagai objek AKTIF yang dapat bertindak dan melakukan hal-hal
tertentu untuk menghasilkan output.

B. Contoh
Sebagai contoh dapat menggunakan data atau objek pesawat. Pada pemrograman
prosedural atau Non-OOP, programmer berpikir bagaimana cara menerbangkan atau
mendaratkan pesawat. Sementara itu pada pemrograman berorientasi objek atau OOP,
programmer berpikir bagaimana pesawat itu terbang atau mendarat. Contoh lainnya
adalah menggunakan sebuah struktur data abstrak semacam stack atau tumpukan. Pada
pemrograman Non-OOP, programmer berpikir bagaimana cara menambahkan item baru
ke dalam stack. Sementara itu pada konsep OOP, programmer berpikir apa yang akan
dilakukan oleh stack saat suatu item baru ditambahkan padanya.
Berikut ini adalah contoh preview dari sebuah program yang menggunakan konsep OOP:
<?php
require_once('application.php');
require_once('page.php');
...
class MyApp extends Application {
...
}
$myapp = new MyApp('Sistem Informasi Ini Itu');
$url = $myapp->parse_query();
$myapp->dislay($url);
?>

EVOLUSI MENUJU OOP


Lebih lanjut lagi, OOP dapat dipandang sebagai hasil evolusi atau pengembangan dari
konsep pemrograman prosedural. Dalam perkembangannya, pemrograman prosedural pun
masih dapat dibagi dalam dua tahap, yaitu pemrograman tak terstruktur dan pemrograman
terstruktur.

A. Pemrograman Tak Terstruktur


Biasanya orang menyebutkan bahwa yang namanya pemrograman tak terstruktur adalah
cara menulis program yang di dalamnya banyak terdapat penulisan kode yang sama atau
mirip secara berulang-ulang, pemisahan bagiannya tidak jelas dan campur aduk, serta alur
programnya kacau dengan adanya lompatan di sana sini (menggunakan perintah GOTO dan
sejenisnya). Namun pemrograman tak terstruktur sebenarnya juga dapat didefinisikan
sebagai program yang di dalamnya terdapat nilai-nilai yang seharusnya merupakan satu
kesatuan namun dipisah-pisahkan sendiri dalam variabel yang berdiri sendiri. Sebagai
contoh ada data mahasiswa, namun di dalam program data NIM dan namanya dipisahkan
ke dalam variabelnya sendiri-sendiri.

B. Pemrograman Terstruktur
Saat program tumbuh menjadi semakin besar, dengan menggunakan konsep pemrograman
tak terstruktur di atas maka program akan menjadi bertambah kompleks dan susah dibaca
maupun dipelihara. Untuk itu kemudian dikembangkanlah konsep pemrograman
terstruktur. Konsep ini ditandai dengan penggunaan fungsi-fungsi atau subprogram untuk
membungkus kode-kode yang merupakan satu kesatuan atau yang ditulis berulang-ulang,
penggunaan looping atau perulangan, dan mengelompokkan bagian-bagian yang serupa ke
dalam unit atau modulnya sendiri-sendiri. Namun akan lebih tepat lagi jika pada
pemrograman terstruktur ini, nilai-nilai yang memang saling berhubungan dan merupakan
satu kesatuan dibungkus atau disatukan ke dalam suatu data yang terstruktur. Penggunaan
tipe data terstruktur semacam array, record, set, hash, stack, queue, tree, dan semacamnya
menjadi dominan di sini. Sebagai contoh, data mahasiswa akan disimpan di dalam sebuah
record yang di dalamnya mengandung field NIM dan nama.
Dalam konsep pemrograman terstruktur, pada awalnya programmer dituntut untuk dapat
mengelompokkan nilai-nilai terkait yang semula terpisah-pisah menjadi satu kesatuan data.
Setelah itu programmer masih harus berpikir untuk membuat fungsi-fungsi yang terpisah
yang nantinya akan digunakan untuk mengolah kesatuan data yang telah dibuat. Misalkan
jika ada data mahasiswa, maka akan dibuat fungsi-fungsi untuk mendaftarkan mahasiswa,
mengisi KRS mahasiswa, memberi nilai mahasiswa, mencetak KHS mahasiswa, dan
seterusnya.

C. Pemrograman Berorientasi pada Objek


Saat program semakin tumbuh besar lagi, konsep pemrograman terstruktur ini kemudian
dirasa sudah kurang mencukupi lagi untuk menanganinya. Kerepotan yang dirasakan
terutama timbul karena adanya pemisahan antara kesatuan-kesatuan data dengan fungsifungsi yang digunakan untuk mengolahnya. Semakin banyak kesatuan data yang dibuat,
maka semakin akan terasa bahwa sebenarnya ada yang mirip satu sama lain, sehingga
fungsi-fungsi yang mengolahnya pun menjadi mirip-mirip. Hal ini sering menyebabkan
munculnya kode yang ditulis berulang-ulang di bagian-bagian yang saling terpisah. Sebagai
contoh adalah data karyawan di sebuah perguruan tinggi, yang dibedakan menjadi
karyawan kependidikan (dosen) dan karyawan non-kependidikan (non-dosen). Kedua data
ini memiliki banyak kesamaan, namun juga ada perbedaannya yang tidak sedikit. Keduanya
sama-sama digaji namun perhitungannya berbeda. Tapi walaupun dikatakan berbeda cara
menghitungnya , ada kemiripannya juga sehingga menyebabkan adanya duplikasi kode.
Selain itu masih banyak contoh yang lainnya.
Untuk memecahkan masalah semacam itu, dikembangkanlah konsep pemrograman
berorientasi pada objek atau OOP. Dalam OOP, bukan hanya nilai-nilai yang terkait saja yang
disatukan ke dalam satu kesatuan, melainkan juga aksi-aksi atau tindakan untuk mengolah
nilai-nilai itu juga. Dengan kata lain, dalam OOP data dan fungsi (tindakan) untuk
mengolahnya dibungkus dalam satu kesatuan. Bungkus inilah yang kemudian dinamakan
sebagai OBJEK. Teknik pembungkusan data dan fungsi ini dikenal dengan istilah
encapsulation atau pengkapsulan. Selain itu ada konsep inheritance atau pewarisan dimana
dua objek yang mirip dapat diturunkan dari sebuah objek yang lebih umum dan mewarisi
semua data dan fungsi yang ada tanpa harus menulis ulang kodenya. Selain itu terdapat juga
konsep polymorphism yang membuat dua objek berbeda dapat diperlakukan dengan cara
yang sama karena diturunkan dari objek umum yang sama, walaupun nantinya dapat
menghasilkan output yang berbeda juga.
Sebagai contoh, masalah karyawan dosen dan karyawan non-dosen di atas. Dengan OOP,
masalah tersebut dapat dipecahkan dengan membuat sebuah objek (sebenarnya istilah
yang lebih tepat adalah class, namun untuk sementara memakai objek dulu supaya lebih
jelas) karyawan yang berlaku bagi karyawan secara umum, baik dosen maupun non-dosen.
Objek ini berisi data dan fungsi yang umum dimiliki oleh seorang karyawan. Setelah itu
tinggal menurunkan objek tersebut ke dalam dua objek terpisah yaitu objek dosen dan
objek non-dosen. Kedua objek ini mewarisi semua yang dimiliki objek karyawan namun
dapat dikustomisasi atau disesuaikan dengan hal-hal yang lebih spesifik. Kedua objek ini
kadang bisa dianggap sama, kadang juga bisa dianggap berbeda.

D. Ringkasan
Ringkasan dari ketiga konsep pemrograman di atas beserta ciri-ciri yang membedakannya
akan dituliskan dalam tabel berikut:

Konsep
Pemrograman
Pemrograman Tak
Terstruktur

Pemrograman
Terstruktur

Pemrograman
Berorientasi pada
Objek

Ciri-Ciri Berkaitan dengan Data dan Pengolahannya


Nilai-nilai data yang harusnya saling berhubungan tertulis secara
terpisah-pisah. Setiap nilai dapat diolah dan dimanipulasi sendirisendiri tanpa harus melihat nilai lainnya yang mungkin memiliki
hubungan dengannya. Pengolahan nilai biasanya dilakukan dengan
perintah-perintah bawaan yang telah tersedia.
Nilai-nilai yang memiliki hubungan disatukan ke dalam satu
kesatuan data, semacam record dan array. Dengan cara ini
hubungan antar nilai menjadi lebih jelas. Pengolahan data
dilakukan terhadap kesatuan tersebut bukan pada nilai-nilainya
secara individual, menggunakan fungsi-fungsi yang terpisah.
Data dan fungsi yang digunakan untuk mengolahnya disatukan ke
dalam sebuah objek. Dengan cara ini akan lebih mudah dan jelas
melihat sebuah objek secara utuh, dari data dan apa yang bisa
dilakukannya.

PENJELASAN LEWAT CONTOH


A. Contoh Kasus
Contoh yang ada di sini akan dijelaskan menggunakan aplikasi PHPDraw. Perintah yang akan
banyak dipakai di sini adalah perintah line untuk menggambar garis. Untuk mengingatkan
lagi, di sini akan dituliskan dulu bentuk umum dari perintah line tersebut:
line(x1, y1, x2, y2, warna);

Perintah tersebut digunakan untuk membuat atau menggambar garis dari koordinat (x1, y1)
menuju ke koordinat (x2, y2) dengan menggunakan warna tertentu.
Pada bagian ini akan dijelaskan bagaimana cara menggambar bentuk bintang segi lima yang
terlihat pada gambar di bawah ini menggunakan ketiga konsep pemrograman yang telah
dijelaskan di atas.
Sedikit asumsi dari gambar tersebut:
Ukuran gambar adalah ukuran default (400x400),
gambar yang terlihat di sebelah telah diperkecil
Warna background juga menggunakan warna default
(putih), sementara garis bintangnya merah
Pusat dari bintang tersebut adalah di tengah-tengah
gambar, yaitu koordinat (200, 200)
Jari-jari bintang atau jarak dari pusat ke setiap pucuk
bintang tersebut adalah 200.
Seperti kata pepatah: Banyak jalan menuju Roma, maka demikian pula dengan menuliskan
program. Satu masalah dapat dipecahkan dengan menggunakan program-program yang
berbeda, bahkan meskipun menggunakan paradigma yang sama. Artinya, program-program
yang dituliskan di sini bukanlah satu-satunya solusi untuk masalah di atas.

B. Pemrograman Tak Terstruktur


Dengan konsep pemrograman terstruktur, tinggal mencari lima koordinat yang membentuk
kelima sudut bintang tersebut. Setelah itu gunakan perintah bawaan line untuk
menggambar garis antar setiap koordinat yang berhubungan. Caranya bisa dengan mencari
nilai x dan y dari setiap koordinat terlebih dahulu, baru menggambarkan garis-garisnya,
seperti yang tergambar dalam pseudocode berikut:
$x1 = ...; $y1
$x2 = ...; $y2
$x3 = ...; $y3
$x4 = ...; $y4
$x5 = ...; $y5
line($x1, $y1,

= ...;
= ...;
= ...;
= ...;
= ...;
$x3, $y3, COLOR_RED);

line($x3,
line($x5,
line($x2,
line($x4,

$y3,
$y5,
$y2,
$y4,

$x5,
$x2,
$x4,
$x1,

$y5,
$y2,
$y4,
$y1,

COLOR_RED);
COLOR_RED);
COLOR_RED);
COLOR_RED);

Atau bisa juga dengan cara menghitung dua koordinat yang saling terhubung dulu dan
diikuti dengan menggambar garisnya, lalu diteruskan dengan mencari koordinat berikutnya
lalu menggambar lagi, dan seterusnya. Dengan cara ini, variabel yang digunakan bisa
dihemat karena bisa menggunakan kembali (reuse) variabel yang nilainya sudah tidak
terpakai lagi, sehingga cukup menggunakan variabel x1 dan y1 untuk koordinat awal garis,
serta x2 dan y2 untuk koordinat akhir garis. Lagipula nilai koordinat akhir dari suatu garis
dapat digunakan kembali sebagai nilai koordinat awal garis yang digambar sesudahnya. Cara
ini dapat dilihat pada pseudocode berikut:
$x1 = ...; $y1
$x2 = ...; $y2
line($x1, $y1,
$x1 = $x2; $y1
$x2 = ...; $y2
line($x1, $y1,
$x1 = $x2; $y1
$x2 = ...; $y2
line($x1, $y1,
$x1 = $x2; $y1
$x2 = ...; $y2
line($x1, $y1,
$x1 = $x2; $y1
$x2 = ...; $y2
line($x1, $y1,

= ...;
= ...;
$x2, $y2,
= $y2;
= ...;
$x2, $y2,
= $y2;
= ...;
$x2, $y2,
= $y2;
= ...;
$x2, $y2,
= $y2;
= ...;
$x2, $y2,

COLOR_RED);
COLOR_RED);
COLOR_RED);

COLOR_RED);
COLOR_RED);

Memang terlihat lebih panjang, namun dengan kode yang terakhir ini program berpotensi
untuk dibawa ke bentuk perulangan, sehingga akan menyederhanakan kode program.
Perhatikan bahwa di sini setiap nilai yang membentuk sebuah koordinat disimpan dalam
variabel-variabel yang berdiri sendiri, semacam $x1, $x2, $y1, dan $y2. Terlebih lagi di situ
terlihat bahwa nilai dari setiap koordinat dihitung sendiri-sendiri tanpa melihat relasinya
dengan koordinat sebelumnya. Hal inilah yang terkadang membuat program menjadi susah
dibaca dan dimengerti.
Detail untuk menghitung setiap koordinatnya tidak akan dijelaskan secara detail disini, yang
jelas menggunakan rumus-rumus yang dikenal dalam trigonometri. Berikut ini salah satu
program yang dapat digunakan untuk membuat gambar bintang semacam itu:
<?php
$x1 =
$x2 =
$y2 =
$x3 =

200; $y1 = 0;
200 + 200*cos(deg2rad(1*72 90));
200 + 200*sin(deg2rad(1*72 90));
200 + 200*cos(deg2rad(2*72 90));

$y3 = 200
$x4 = 200
$y4 = 200
$x5 = 200
$y5 = 200
line($x1,
line($x3,
line($x5,
line($x2,
line($x4,
?>

+ 200*sin(deg2rad(2*72 90));
+ 200*cos(deg2rad(3*72 90));
+ 200*sin(deg2rad(3*72 90));
+ 200*cos(deg2rad(4*72 90));
+ 200*sin(deg2rad(4*72 90));
$y1, $x3, $y3, COLOR_RED);
$y3, $x5, $y5, COLOR_RED);
$y5, $x2, $y2, COLOR_RED);
$y2, $x4, $y4, COLOR_RED);
$y4, $x1, $y1, COLOR_RED);

Angka 72 yang ada dalam program tersebut merupakan besarnya sudut (dalam derajat)
yang terbentuk dari dua buah pucuk bintang yang berdekatan, dilihat dari pusat bintangnya.
Angka 72 tersebut dihitung dari besarnya sudut yang dibentuk sebuah lingkaran penuh
(360o) dibagi banyaknya pucuk atau segi dari bintang (5). Perintah deg2rad (dibaca deg-torad) yang ada di program tersebut digunakan untuk mengkonversi nilai sudut dari satuan
derajat (degree) ke satuan radian. Hal ini karena dalam PHP semua fungsi trigonometri
(semacam cos, sin dan tan) semuanya beroperasi dalam satuan radian, bukan derajat.
Selanjutnya silahkan dipelajari sendiri.

C. Pemrograman Terstruktur
Dengan menggunakan konsep pemrograman terstruktur, setiap nilai x dan y yang ada tidak
akan dianggap sebagai nilai yang terpisah. Pemrograman terstruktur berusaha mengatur
dan mengelompokkan nilai-nilai yang tercerai berai tersebut agar lebih mudah dikelola.
Kesatuan data yang menyatukan setiap nilai x dan y tersebut diberi nama sesuai dengan
maksudnya, yaitu sebagai koordinat. Untuk keperluan tersebut biasanya digunakan record,
yang dalam hal ini memiliki dua buah field yaitu field x dan field y. Demikian juga dengan
nilai-nilai yang menyusun sebuah garis, disatukan ke dalam sebuah record yang disebut
sebagai garis dan memiliki tiga field, yaitu: koordinat awal, koordinat akhir, dan warna-nya.
Selain itu juga perlu dibuat fungsi-fungsi yang akan digunakan untuk membuat
(mengkonstruksi), mengakses dan memanipulasi kesatuan data yang telah dibuat. Fungsi
untuk membuat kesatuan data tugasnya adalah mengumpulkan nilai-nilai yang ada dan
membentuk kesatuan data darinya. Nilai-nilai yang akan dikumpulkan disebutkan sebagai
argumen dari fungsi, dan sebagai balasannya fungsi menghasilkan sebuah record yang berisi
nilai-nilai tersebut. Fungsi semacam ini dinamakan sebagai fungsi konstruktor. Contohnya:
function buat_koordinat($x, $y) {
return array('x' => $x, 'y' => $y);
}

Sementara itu fungsi untuk mengakses dan manipulasi biasanya menggunakan kesatuan
data yang terkait sebagai parameter pertama. Jika tidak berniat mengubah nilai yang ada di
dalamnya maka akan menggunakan parameter pass-by-value, seperti contoh berikut:

function gambar_titik($koordinat) {
pixel($koordinat['x'], $koordinat['y'], $koordinat['warna']);
}

Sementara jika berniat akan mengubah nilai maka akan menggunakan parameter pass-byreference, seperti contoh berikut:
function pindah_koordinat(&$koordinat, $dx, $dy) {
$koordinat['x'] += $dx;
$koordinat['y'] += $dy;
}

Berikut ini contoh jawaban menggunakan konsep pemrograman terstruktur:


<?php
function buat_koordinat($x, $y) {
return array(
'x' => $x,
'y' => $y
);
}
function ubah_koordinat(&$koordinat, $x, $y) {
$koordinat['x'] = $x;
$koordinat['y'] = $y;
}
function putar_koordinat(&$koordinat, $pusat, $sudut) {
$x0 = $pusat['x'];
$y0 = $pusat['y'];
$x1 = $koordinat['x']; $y1 = $koordinat['y'];
$dx = $x1 - $x0;
$dy = $y1 - $y0;
$a = deg2rad($sudut);
$x2 = $x0 + $dx*cos($a) - $dy*sin($a);
$y2 = $y0 + $dx*sin($a) + $dy*cos($a);
ubah_koordinat($koordinat, $x2, $y2);
}
function buat_garis($awal, $akhir, $warna) {
return array(
'awal' => $awal,
'akhir' => $akhir,
'warna' => $warna
);
}
function gambar_garis($garis) {
$x1 = $garis['awal']['x']; $y1 = $garis['awal']['y'];
$x2 = $garis['akhir']['x']; $y2 = $garis['akhir']['y'];
line($x1, $y1, $x2, $y2, $garis['warna']);
}
function putar_garis(&$garis, $pusat, $sudut) {
putar_koordinat($garis['awal'], $pusat, $sudut);

putar_koordinat($garis['akhir'], $pusat, $sudut);


}
$pusat = buat_koordinat(200, 200);
$pucuk = buat_koordinat(200, 0);
putar_koordinat($pucuk, $pusat, 144);
$garis = buat_garis(buat_koordinat(200, 0), $pucuk, COLOR_RED);
for ($i = 0; $i < 5; $i++) {
gambar_garis($garis);
putar_garis($garis, $pusat, 144);
}
?>

Tentu saja masih ada cara yang berbeda untuk memperoleh hasil yang sama.

D. Pemrograman Berorientasi pada Objek


Program berikut ini merupakan program yang sama ditulis menggunakan konsep OOP.
Untuk sementara di sini hanya akan dituliskan dulu, dengan penjelasan akan diberikan nanti.
Untuk sementara tidak semua fitur OOP akan digunakan di sini, untuk menyederhanakan
jawaban.
<?php
class Koordinat {
var $x;
var $y;
function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
function ubah($x, $y) {
$this->x = $x;
$this->y = $y;
}
function putar($pusat, $sudut) {
$x0 = $pusat->x; $y0 = $pusat->y;
$x1 = $this->x; $y1 = $this->y;
$dx = $x1 - $x0; $dy = $y1 - $y0;
$a = deg2rad($sudut);
$x2 = $x0 + $dx*cos($a) - $dy*sin($a);
$y2 = $y0 + $dx*sin($a) + $dy*cos($a);
$this->ubah($x2, $y2);
}
}
class
var
var
var

Garis {
$awal;
$akhir;
$warna;

function __construct($awal, $akhir, $warna) {


$this->awal = $awal;
$this->akhir = $akhir;
$this->warna = $warna;
}
function gambar() {
$x1 = $this->awal->x;
$y1 = $this->awal->y;
$x2 = $this->akhir->x;
$y2 = $this->akhir->y;
line($x1, $y1, $x2, $y2, $this->warna);
}
function putar($pusat, $sudut) {
$this->awal->putar($pusat, $sudut);
$this->akhir->putar($pusat, $sudut);
}
}
$pusat = new Koordinat(200, 200);
$pucuk = new Koordinat(200, 0);
$pucuk->putar($pusat, 144);
$garis = new Garis(new Koordinat(200, 0), $pucuk, COLOR_RED);
for ($i = 0; $i < 5; $i++) {
$garis->gambar();
$garis->putar($pusat, 144);
}
?>

MIGRASI DARI NON-OOP KE OOP


A. Pembuatan Class
Kesatuan data (record) yang ada di pemrograman non-OOP (terstruktur) beserta segala
fungsi yang terkait dengannya, dalam OOP disatukan ke dalam satu konsep yang dinamakan
sebagai class. Nilai-nilai yang ada di record dijadikan sebagai field anggota class, sedangkan
fungsi-fungsi yang terkait dijadikan sebagai metode anggota class.
Sebagai contoh diambil record koordinat, jika dijadikan sebagai class garis besar kodenya
adalah sebagai berikut:
class Koordinat {
...
}

Sebagai catatan tambahan, dalam PHP ada kesepakatan bersama (namun bukan keharusan),
bahwa nama class menggunakan huruf besar di huruf pertama tiap kata. Contohnya adalah:
Koordinat, Garis, SegiTiga, SegiEmpat, Mahasiswa, Dosen, MataKuliah, dll.

B. Field Anggota Class


Field anggota class diimplementasikan sebagai sebuah variabel yang ada di dalam sebuah
class. Untuk membuatnya harus melalui deklarasi terlebih dahulu menggunakan keyword
var. Berikut ini contoh pendeklarasian field x dan y dalam class Koordinat:
class Koordinat {
var $x;
var $y;
...
}

C. Metode Anggota Class


Metode anggota class diimplementasikan sebagai sebuah fungsi yang dideklarasikan di
dalam class. Cara pembuatannya sama persis dengan fungsi biasa, hanya saja berada di
dalam class. Perbedaan lainnya adalah, jika pada konsep pemmrograman terstruktur setiap
fungsi untuk mengakses atau memanipulasi nilai dalam record membutuhkan record yang
terkait sebagai parameter pertamanya, maka pada konsep OOP parameter pertamanya
tersebut dihilangkan. Alasannya akan dijelaskan di bagian berikutnya. Sebagai contoh, fungsi
untuk menggambar garis dan memutar garis berikut:
function gambar_garis($garis) {
...
}
function putas_garis(&$garis, $pusat, $sudut) {
...
}

Kedua fungsi tersebut jika dijadikan metode dalam konsep OOP menjadi sbb:
class Garis {
...
function gambar() {
...
}
function putar($pusat, $sudut) {
...
}
...
}

Perhatikan bahwa nama fungsi atau metode pada OOP menjadi lebih pendek dari
sebelumnya. Hal ini karena nama kesatuan data yang akan diolah sudah terwakili sebagai
nama class, jadi di nama fungsi tidak perlu disebutkan lagi. Sementara itu di konsep nonOOP nama fungsi harus lengkap dan jelas supaya jika ada kesatuan data yang memiliki
fungsi yang bernama sama tidak akan saling bertumbukan, misalkan fungsi
putar_koordinat dan fungsi putar_garis. Pada OOP kedua fungsi tersebut cukup
menggunakan nama putar saja.

D. Pengaksesan Anggota dari Objek


Untuk mengakses anggota sebuah class lewat objeknya, baik itu field maupun metode,
digunakan operator -> (bisa dianggap sebagai anak panah). Bentuk umumnya adalah
sebagai berikut:
$nama_objek->nama_anggota

Misalkan untuk mengakses field warna dari objek garis L, kodenya adalah:
$L->warna

Pada konsep non-OOP yang menggunakan record, kode di atas memiliki kesamaan dengan
kode:
$L['warna']

Sedangkan untuk mengakses metode gambar pada objek garis L, kodenya adalah:
$L->gambar();

Kode tersebut memiliki kesamaan dengan kode non-OOP berikut:


gambar_garis($L);

Dilihat dari sisi manapun cara penulisan kode menggunakan konsep OOP jauh lebih singkat
dan lebih jelas dimengerti serta lebih mudah dituliskan.

E. Objek Khusus $this


Pada konsep non-OOP setiap fungsi yang berkaitan dengan sebuah kesatuan data pasti
parameter pertamanya adalah berupa yang mewakili kesatuan data terkait, kecuali fungsi
konstruktor. Hal ini karena pada konsep non-OOP pola pikirnya adalah melakukan sesuatu
terhadap data, jadi setiap akan melakukan sesuatu pada data maka harus disebutkan data
mana yang akan dikenai tindakan.
Contohnya dapat dilihat pada potongan kode program berikut:
pindah_koordinat($A, 10, 0);
pindah_koordinat($B, 0, 10);

Statement pertama di atas digunakan untuk memindahkan data koordinat A ke kanan,


sementara statement kedua digunakan untuk memindahkan data koordinat B ke bawah.
Perhatikan bahwa fungsi dapat diterapkan pada dua data yang berbeda tergantung dari
argumen yang diberikan.
Pada konsep OOP, pola berpikirnya adalah menyuruh sebuah objek untuk melakukan
sesuatu. Oleh karena itu maka objek mana yang akan disuruh tidak perlu disebutkan lagi
sebagai argumen dari perintah atau fungsi yang akan digunakan. Jika hal tersebut dilakukan
di luar deklarasi class akan mudah dilakukan, seperti kode berikut yang merupakan versi
OOP dari contoh kode sebelumnya:
$A->pindah(10, 0);
$B->pindah(0, 10);

Statement di atas maksudnya adalah untuk menyuruh objek koordinat A untuk berpindah
ke kanan dan menyuruh objek koordinat B untuk berpindah ke bawah.
Sekali lagi, jika hal tersebut dilakukan di luar class dan merujuk pada satu objek tertentu,
maka tinggal sebut nama objeknya atau variabel yang menampung objek diikuti dengan
nama anggota yang mau diakses setelah operator ->. Namun jika kode pengaksesan
dilakukan di dalam class maka menjadi lain ceritanya. Kode pengaksesan anggota di dalam
class umumnya tidak digunakan untuk mengakses anggota dari objek yang spesifik, namun
ditujukan untuk semua objek yang dibuat dari class tersebut. Oleh karena itu tidak
dimungkinkan untuk merujuk pada suatu objek buatan tertentu.
Untuk keperluan tersebut, PHP menyediakan sebuah objek khusus yang bernama $this.
Objek ini dapat digunakan di dalam deklarasi metode/fungsi dalam class untuk merujuk
pada objek yang menggunakan metode itu. Kata this atau dalam Bahasa Indonesia ini
dapat diartikan sebagai objek ini atau lengkapnya objek yang sedang menggunakan
metode ini.

Sebagai contoh, misalkan jika dalam konsep non-OOP ada fungsi berikut:
fungsi pindah_koordinat(&$koordinat, $dx, $dy) {
$koordinat['x'] += $dx;
$koordinat['y'] += $dy;
}

Maka di dalam konsep OOP, parameter pertama ($koordinat) tidak perlu disebutkan dan
setiap variabel $koordinat di dalam tubuh fungsi diganti menjadi $this. Sehingga pada
konsep OOP kode programnya menjadi berikut:
class Koordinat {
...
fungsi pindah($dx, $dy) {
$this->x += $dx;
$this->y += $dy;
}
...
}

Saat metode pindah tersebut digunakan oleh objek $A sebagai berikut:


$A->pindah(100, 50);

maka secara otomatis objek $this akan merujuk pada objek $A.

F. Fungsi Konstruktor
Pada konsep non-OOP yang namanya fungsi konstruktor hanyalah sebuah fungsi yang
utamanya untuk memudahkan proses pembuatan struktur data yang diinginkan. Artinya
fungsi ini sebenarnya cenderung tidak begitu dibutuhkan untuk struktur data yang
sederhana. Sebagai contoh fungsi konstruktor untuk data koordinat berikut:
function buat_koordinat($x, $y) {
return array('x' => $x, 'y' => $y);
}

Untuk membuat data koordinat A (200, 200) menggunakan fungsi konstruktor di atas
kodenya adalah sebagai berikut:
$A = buat_koordinat(200, 200);

Tanpa fungsi konstruktor maka data yang sama dapat dibuat dengan kode berikut:
$A = array('x' => 200, 'y' => 200);

Berlawanan dengan itu, pada konsep OOP fungsi konstruktor adalah suatu keharusan.
Fungsi konstruktor biasanya digunakan untuk melakukan inisialisasi saat sebuah objek
diciptakan. Atau jika dilihat secara teknis, dalam fungsi konstruktor ini dilakukan inisialisasi
terhadap objek $this.

Dalam PHP, terutama PHP 5, fungsi konstruktor dalam class harus menggunakan nama
khusus __construct. Sementara itu daftar parameter yang digunakan secara umum sama
dengan fungsi konstruktor pada fungsi konstruktor non-OOP.
Sebagai contoh, akan dibuat fungsi konstruktor versi OOP dari contoh fungsi konstruktor
non-OOP di atas. Sebelumnya akan dibuat sedikit modifikasi terhadap contoh di atas,
dengan membuat variabel sementara yang di-return-kan oleh fungsi konstruktor, sebagai
berikut:
function buat_koordinat($x, $y) {
$koordinat = array();
$koordinat['x'] = $x;
$koordinat['y'] = $y;
return $koordinat;
}

Pada konsep OOP, tidak diperlukan untuk menciptakan variabel sementara karena sudah
disediakan objek $this yang siap dipakai dan juga tidak perlu di-return-kan. Berikut ini
kode program untuk fungsi konstruktor versi OOP:
class Koordinat {
...
function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
...
}

G. Pembuatan Objek atau Instance


Dalam konsep OOP di PHP, untuk membuat sebuah objek dari class tertentu menggunakan
operator new, yang dalam Bahasa Indonesia artinya adalah baru, yang bermakna
membuat objek baru. Bentuk umumnya adalah sebagai berikut:
$nama_objek = new NamaClass(daftar argumen);

Sebagai contoh kode untuk membuat objek Koordinat dengan nama A di (200, 300)
menggunakan kode berikut:
$A = new Koordinat(200, 300);

Kode tersebut serupa dengan versi non-OOP berikut (meskipun berbeda pada tipe data yang
dihasilkan):
$A = buat_koordinat(200, 300);

TERMINOLOGI DALAM OOP


A. Encapsulation
Istilah encapsulation atau pengkapsulan mengacu pada penyatuan antara data dan metode
atau fungsi ke dalam sebuah bungkus yang disebut sebagai object. Selain itu ada juga yang
mendefiniskannya sebagai pembungkusan data dengan metode-metode pengaksesnya.

B. Information Hiding
Pada definisi kedua dari encapsulation di atas, dikatakan bahwa data dibungkus
menggunakan metode-metode yang digunakan untuk mengolahnya. Lebih lanjut lagi,
dengan adanya pembungkusan ini maka seolah-olah data disembunyikan dari dunia luar,
sehingga tidak bisa diakses secara langsung melainkan harus menggunakan metode-metode
yang membungkusnya. Konsep penyembunyian data dari dunia luar ini disebut sebagai
information hiding. Tujuan utamanya adalah untuk menjaga konsistensi data, karena data
tidak dapat diubah sesuka hati.

C. Class, Object dan Instance


Bangunan utama dari konsep OOP adalah sebuah entiti yang dinamakan sebagai class.
Class didefinisikan sebagai sebuah konsep atau gagasan yang menggambarkan data apa saja
yang dimiliki dan tindakan apa saja yang dapat dilakukan atau dikenakan pada sekelompok
objek yang sejenis. Class juga dapat dianggap sebagai gambaran atau deskripsi dari suatu
objek. Oleh karena itu, class merupakan sebuah konsep abstrak yang belum dapat
digunakan secara langsung kecuali sudah diwujudkan dalam bentuk yang nyata.
Perwujudan nyata dari class yang siap digunakan itulah yang disebut sebagai object.
Setelah berwujud sebagai object inilah maka baru dapat dilakukan akses terhadap data yang
dimuatnya dan juga dapat disuruh untuk melakukan suatu tindakan atau pekerjaan. Untuk
menekankan bahwa sebuah object merupakan implementasi nyata dari class, maka object
juga dikenal dengan istilah instance, yang bisa diterjemahkan sebagai perwujudan.
Jika diambil contoh pada kehidupan nyata, contoh class adalah: Mahasiswa, Dosen, Meja,
Kursi, Mobil, Hewan, Burung, Kucing, dan sebagainya. Sementara itu contoh objek adalah:
Saipul, Unyil, Paijo, kursi yang diduduki Sigit, meja di depan Ririn, mobil ferari milik Pak
Badu, burungnya Si Unyil, kucing hitam kepunyaan Andi, dan lain sebagainya. Dapat dilihat
di sini, bahwa class mewakili sesuatu yang berupa konsep tanpa menunjuk objek nyatanya,
sementara object langsung menunjuk pada suatu yang nyata.

D. Member, Field dan Method


Setiap data dan fungsi yang termuat di dalam sebuah class dinamakan sebagai member atau
anggota dari class yang bersangkutan. Anggota yang berupa data dinamakan sebagai field
atau atribut atau properti dari class. Sedangkan anggota yang berupa fungsi dinamakan
sebagai method atau metode dari class.

Sebagai contoh, sebuah class Mahasiswa memiliki field semacam: NIM, nama, angkatan,
program studi, jenis kelamin, umur, dll. Selain itu class Mahasiswa juga memiliki metode
semacam: mendaftar ulang (heregistrasi), mengisi KRS, mengikuti ujian, melakukan
presensi, membuat tugas akhir, dll.

E. Inheritance
Salah satu keunggulan OOP dalam hal code reuse (penggunaan kembali kode program yang
sudah ada sebelumnya) yang tidak ada dalam konsep non-OOP adalah adanya konsep
inheritance atau pewarisan. Dengan konsep ini maka sebuah class dapat diturunkan dari
class lain yang lebih umum dan juga dapat menurunkan class-class yang lebih spesifik. Setiap
ada penurunan class, maka semua sifat (anggota) yang ada pada class yang diturunkan akan
otomatis dimiliki atau diwarisi oleh class turunannya tanpa harus menulis ulang kode
programnya.
Sebagai contoh, dari class Bidang dapat diturunkan berbagai macam class yang
merepresentasikan bidang-bidang tertentu, semacam class SegiEmpat, SegiTiga, Lingkaran,
Elips, dll. Demikian juga dari class SegiEmpat mungkin dapat diturunkan lebih lanjut menjadi
class PersegiPanjang, BujurSangkar, BelahKetupat, JajaranGenjang, LayangLayang, dll. Opsi
lainnya adalah bahwa class BujurSangkar adalah turunan dari class PersegiPanjang, karena
sebuah bujur sangkar merupakan bentuk khusus dari sebuah persegi panjang, dimana
panjang dan lebarnya sama. Dari situ kemudian dapat disimpulkan bahwa class
BelahKetupat adalah turunan dari class LayangLayang dan class Lingkaran merupakan
turunan dari class Elips.
Proses penurunan atau sering disebut sebagai subclassing ini membentuk sebuah pohon
hirarki pewarisan atau dinamakan inheritance tree. Bentuk hirarkinya mirip dengan hirarki
silsilah (namun tanpa perkawinan), sehingga istilah-istilah yang ada pada silsilah pun
digunakan di sini, semacam: orang tua (parent), anak (child), leluhur (anchestor), dan
keturunan (descendant). Berikut ini adalah gambaran dari hirarki pewarisan dari contoh di
atas (urutan dari kiri ke kanan tidak penting):

Bidang

SegiEmpat

PersegiPanjang

BujurSangkar

JajaranGenjang

SegiTiga

LayangLayang

BelahKetupat

Elips

Lingkaran

F. Subclass, Superclass, Descendant dan Anchestor


Subclass adalah class yang menjadi turunan langsung dari suatu class lain, dinamakan juga
sebagai derived class atau child class. Superclass adalah class yang menurunkan langsung
class lain, sering dinamakan juga sebagai base class atau parent class. Descendant atau
keturunan adalah class-class yang berada di bawah suatu class pada garis hirarki inheritance.
Anchestor atau leluhur adalah clas-class yang berada segaris di atas hirarki inheritance.
Sebuah sublass pastilah descendant namun tidak selalu untuk sebaliknya. Sebuah superclass
pasti termasuk anchestor, namun juga tidak selalu berlaku untuk sebaliknya. Subclass dari
suatu class bisa banyak, namun superclass atau parent class-nya pasti hanya satu.
Konsep satu parent ini dianut oleh kebanyakan sistem OOP yang ada saat ini, dan
dinamakan sebagai konsep single inheritance. Konsep multiple inheritance, yang
mengijinkan penurunan class dari beberapa class sekaligus, juga ada namun tidak banyak
yang menganutnya.
Dari contoh di bagian sebelumnya, dapat dikatakan bahwa class Bidang merupakan
superclass dari class SegiEmpat, SegiTiga dan Elips. Sebaliknya, class SegiEmpat, SegiTiga dan
Elips adalah subclass dari class Bidang. Demikian juga dapat dikatakan bahwa class Bidang
merupakan anchestor dari semua class yang disebutkan disitu, termasuk SegiEmpat,
SegiTiga, Elips, Lingkaran, BujurSangkar, JajaranGenjang, dll. Sebaliknya, semua class
tersebut merupakan descendant dari class Bidang.
Class SegiEmpat memiliki 3 subclass dan 5 descendant. Class BujurSangkar memiliki 3
anchestor, yaitu: class PersegiPanjang, SegiEmpat, dan Bidang. Class JajaranGenjang dan
class SegiTiga BUKANLAH anchestor dari class BujurSangkar. Demikian juga, class Lingkaran
BUKANLAH merupakan descendant dari class SegiEmpat.

G. Polymorphism
Salah satu keunggulan dari konsep OOP adalah keberadaan polymorphism, yaitu
kemampuan menangani objek yang berasal dari class yang berbeda menggunakan suatu
antarmuka yang seragam. Dengan kata lain, polymorphism memungkinkan sebuah objek
yang sama pada waktu yang berbeda dianggap berasal dari dua class yang berbeda, lalu
melakukan hal yang sama, namun hasilnya bisa jadi berbeda.
Sebagai contoh, sebuah object dari class SegiEmpat, satu saat dianggap sebagai object dari
class BujurSangkar (boleh karena sebuah bujur sangkar juga merupakan segi empat) dan
saat lain dianggap sebagai object dari class JajaranGenjang (boleh juga karena jajaran
genjang juga segi empat). Ketika sama-sama disuruh menghitung luasnya, maka caranya
sama (menggunakan metode yang sama) namun hasilnya bisa jadi berbeda.

H. Constructor dan Destructor


Selain konstruktor, dalam OOP juga dikenal istilah destruktor, yang merupakan kebalikan
dari konstruktor. Konstruktor berasal dari kata construct yang artinya membangun, dan

memang digunakan untuk membangun sebuah object dari class tertentu. Biasanya di dalam
konstruktor berisi kode-kode yang digunakan untuk menginisialisasi nilai-nilai awal yang
dimiliki suatu object yang akan diciptakan. Sedangkan destruktor berasal dari kata
destruct yang berarti menghancurkan, karena memang tugasnya adalah untuk
menghancurkan atau menghapus object dari memory. Pada PHP, destruktor tidak terlalu
banyak digunakan karena PHP berbaik hati untuk menghapus sendiri object-object yang
sudah tidak diperlukan lagi. Namun, jika memang destruktor digunakan, maka secara umum
di dalamnya memuat kode-kode finalisasi saat object hendak dihapus dari memory.
Pada PHP, terutama PHP 5, konstruktor dibuat menggunakan sebuah metode khusus yang
bernama __construct dan destruktor menggunakan metode __destruct. Berikut ini
contoh class yang menggunakan konstruktor dan destruktor:
class TextFile {
private $filename;
private $fp;
public function __construct($filename) {
$this->filename = $filename;
$this->fp = fopen($this->filename, 'r');
}
public function __destruct() {
fclose($this->fp);
}
...
}
$f = new TextFile();
...
unset($f);

Pada contoh di atas, konstruktor digunakan untuk membuka file (fopen) dan destruktor
digunakan untuk menutup file (fclose). Konstruktor dipanggil atau dijalankan saat sebuah
object dibuat menggunakan operator new. Sedangkan destruktor dipanggil atau dijalankan
kapan pun sebuah object dihapus dari memory, baik disengaja (menggunakan perintah
unset) maupun saat object sudah tidak direferensi lagi, atau saat program berakhir.

I. Member Visibility, Public atau Private


Member visibility atau kenampakan anggota adalah konsep yang melanjutkan konsep
encapsulation dan information hiding yang sudah dijelaskan di atas. Seperti telah dituliskan
sebelumnya, bahwa sebuah field seharusnya tidak boleh diakses secara sembarangan dan
dilindungi dari akses dunia luar. Demikian juga terkadang metode-metode yang menangani
proses internal yang seharusnya tidak diekspos ke dunia luar sebaiknya dilindungi juga.
Untuk itu maka field dan metode tersebut harus dibuat tidak nampak dari luar class.

Konsep inilah kemudian yang memunculkan istilah anggota private (pribadi) dan anggota
publik. Anggota private seharusnya dilindungi supaya tidak diakses sembarangan,
sedangkan yang namanya anggota publik boleh diakses dari luar. Sebenarnya masih ada
satu lagi jenis pengaksesan yang dinamakan sebagai protected (diproteksi) yang
tingkatannya berada di antara publik dan private.
Ketiga konsep visibility ini diwakili oleh keyword private, protected dan public yang
dituliskan di depan nama field (menggantikan keyword var) atau di depan deklarasi fungsi
(metode). Sebagai contoh dapat dilihat pada potongan program berikut:
class Circle {
private $radius;
public function __construct($r) {
$this->radius = $r;
}
}

Dapat dilihat pada potongan program tersebut bahwa class Circle memiliki sebuah field
privat dengan nama $radius dan metode publik yang berupa konstruktor. Pada umumnya
yang namanya konstruktor selalu bersifat publik.

J. Getter dan Setter


Mengacu pada konsep encapsulation dan information hiding, maka setiap field seharusnya
dibuat sebagai anggota privat. Jika konsep tersebut diterapkan maka setiap field menjadi
benar-benar tidak dapat diakses dari luar, baik dibaca maupun dimodifikasi nilainya. Untuk
dapat mengaksesnya maka diperlukan metode yang dirancang untuk membaca atau
memodifikasi nilai dari field. Metode semacam ini dinamakan sebagai getter dan setter.
Metode getter (dari kata get) ditujukan untuk mengambil atau membaca nilai suatu field.
Sedangkan metode setter (dari kata set) ditujukan untuk menge-set atau mengubah nilai
suatu field. Jika suatu field dirancang agar dapat dibaca dan ditulis (dimodifikasi) maka
untuk field itu dibuatlah metode getter dan setter-nya. Namun jika suatu field dirancang
supaya bersifat read-only atau tidak dapat diubah sembarangan nilainya maka cukup
dibuat metode getter-nya.
Berikut ini contoh class yang menggunakan getter dan setter:
class Circle {
private $radius;
private $area;
private $circumference;
public function __construct($r) {
$this->set_radius($r);
}

private function calculate() {


$this->area = M_PI*$this->radius*$this->radius;
$this->circumference = 2*M_PI*$this->radius;
}
public function get_radius() {
return $this->radius;
}
public function set_radius($r) {
$this->radius = $r;
$this->calculate();
}
public function get_area() {
return $this->area;
}
public function get_circumference() {
return $this->circumference;
}
}

Pada class Circle di atas didefinisikan tiga buah field privat, yaitu $radius (jari-jari), $area
(luas), dan $circumference (keliling). Selain itu didefinisikan juga sebuah metode internal
(privat) yang digunakan untuk menghitung luas dan keliling, yaitu metode calculate. Field
$radius merupakan field yang dapat dimodifikasi karena memiliki getter dan setter,
sementara field $area dan $circumference adalah field yang bersifat read-only, karena
hanya memiliki getter saja.

Anda mungkin juga menyukai